>  기사  >  백엔드 개발  >  Python에서 문자열 상수를 변수로 변환하는 방법은 무엇입니까? (예제 포함)

Python에서 문자열 상수를 변수로 변환하는 방법은 무엇입니까? (예제 포함)

不言
不言앞으로
2019-03-18 10:15:093834검색


이 기사에서는 Python에서 문자열 상수를 변수로 변환하는 방법을 설명합니다. (예시 포함) 참고할만한 가치가 있으니 도움이 필요한 친구들이 참고하시면 좋을 것 같습니다.

이 글은 관련된 내용의 요점을 정리하고 이를 더 많은 학습 주제로 확장하는 것이 도움이 되기를 바랍니다.

1. 변수 이름을 동적으로 생성하는 방법은 무엇입니까?

M 학생의 질문은 다음과 같습니다.

죄송합니다. 질문하고 싶습니다. 목록 = ['A', 'B', '로 알려져 있습니다. C', 'D' ], 목록에 있는 요소의 이름을 딴 새 목록 A = [], B = [], C = [], D = []를 어떻게 얻을 수 있나요? 간단히 이해하자면, 이 질문의 의미는 문자열 내용을 다른 객체의 변수 이름으로 사용한다는 것입니다.

목록의 요소는 문자열입니다. 여기서 'A'-'D'는 상수이고 필요한 결과에서 A-D는 변수입니다.

상수를 변수로 직접 사용하도록 강제하면 오류가 보고됩니다.

>>> 'A' = []
...SyntaxError: can't assign to literal

오류에 나오는

은 컴퓨터에서 일반적인 개념입니다. science, #🎜 🎜# 소스코드에서 고정된 값을 표현하는데 사용됩니다.

예를 들어 정수, 부동 소수점 숫자, 문자열과 같은 기본 유형은 리터럴입니다. literal 指的是字面量리터럴 수량은 수량 자체를 의미하며, 이는 원자적 실체로 이해될 수 있으며 물론 값을 할당할 수 없습니다.

따라서 검색된 문자열 내용을 직접 변수명으로 사용할 수 없으며, 다른 방법을 찾아야 합니다.

일부 초보자는 궁금해할 수도 있습니다. list[0] = [] 괜찮나요? 물론 그렇지 않습니다. A가 나타나지 않기 때문입니다. A = list[0]이고 A = []는 어떻습니까? 여기서 A는 기존 조건에서 생성된 것이 아니라 허공에서 정의되었기 때문에 작동하지 않습니다.

당시에는 그룹에서 두세 명의 학생만 토론에 참여했고, 우리는 해결책을 생각하지 못했습니다. 그러나 나는 이 주제가 매우 흥미롭고 생각해 볼 가치가 있다고 생각한다.

이 문제가 해결된다면 변수 이름을 미리 정의하지 않고 동적으로 생성할 수 있다는 뜻입니다. 이렇게 하면 변수 이름을 지정하는 수고가 줄어들 뿐만 아니라 자동 코딩도 가능해집니다!

인공지능이 코드를 작성할 때, 인공지능이 알려진 조건을 기반으로 변수 이름을 동적으로 생성할 수 있다면 코드 작성 과정이 훨씬 더 원활해지지 않을까요? (인공지능도 이제 코드를 작성할 수 있다고 하네요. 변수 이름을 지을 때 어떤 방식을 사용하는지 궁금합니다.)

2 방법은 항상 있습니다

#🎜🎜 #최근에는 몇 가지가 있습니다. 이런 이유로 광고를 하는 사람들이 스터디 그룹에 몰래 들어왔습니다. 예를 들어 그룹의 질문을 사용하여 평가를 하는 등 검토 임계값을 높이기로 결정했습니다.

생각지도 못했던 첫 번째 학생 Q가 거의 아무 생각 없이 평가를 받게 되었는데, 위의 문제를 해결하기 위한 아이디어가 떠올랐습니다. 그런데 우연이 거의 동시에 그룹의 동급생 J가 또 다른 해결책을 생각해 냈습니다. (그는 그룹에서 토론을 보지 못했지만 Knowledge Planet의 기록을 보고 이 문제에 대해서만 알게 되었습니다.)

즉, 전날 밤에 해결이 불가능하다고 생각했던 문제가 다음날 실제로 두 가지 다른 해결책을 얻었습니다!

그럼 그들의 대답은 무엇일까요?

# J 同学的解答
>>> list1 = ['A', 'B', 'C', 'D']
>>> for i in list1:
>>>     globals()[i] = []
>>> A
[]

이 방법은 전역 네임스페이스를 수정하여 새 변수를 교묘하게 "정의"합니다. globals() 메소드는 사전을 꺼내는데, 문자열 'A'는 키 중 하나이며, 이 키는 바로 전역 네임스페이스의 변수로서 상수에서 변수로의 변환을 구현합니다.

데이터 구조 수준에서는 빈 목록 []이 해당 문자열 키 값에 값으로 바인딩되고, 응용 프로그램 수준에서는 변수 내용과 변수 이름이 함께 바인딩되어 사용됩니다.

이 답변을 보고 문득 지난달에

동적 변수 할당에 관한 "Traps of Dynamic Assignment in Python"이라는 글을 다시 게시한 것이 생각났습니다. 질문! 나는 globals()와 locals() 사용법의 차이점에만 초점을 맞춘 것 같지만 원래 용도를 실제로 파악하지는 못했습니다.

J 동창이 그 글을 보고 이 방법을 배웠다고 하더군요. 재미있네요. 제가 진심으로 삼켰던 지식을 공유하고, 동급생 J가 이를 흡수하고 마스터했고, 마침내 피드백이 돌아와 문제를 해결했습니다.

지식 공유의 매력을 실감합니다: 지식은 흐름 속에서 생명을 얻고 충돌 속에서 빛납니다.

동시에 나는 또한 상호 지원하는 학습 그룹의 이점을 진심으로 이해합니다.

다른 사람에게 이익이 되는 사람은 자신에게도 이익이 되고, 서로 돕는 사람은 발전합니다. 함께.

3. 동적으로 코드를 실행하는 방법

Q는 다른 답변을 제공했습니다.# 🎜🎜#
# Q 同学的解答
>>> list1 = ['A', 'B', 'C', 'D']
>>> for i in list1:
>>>     exec(f"{i} = []")
>>> A
[]

그의 작성 방법은 Python 3.6에서 도입된 f-strings 기능을 사용합니다. 실제로, exec() 메소드에서 받은 매개변수만 확인하면 됩니다. 변수 i의 문자열을 사용할 수 있습니다. 예를 들어 다음과 같이 작성합니다.

# 以下代码可替换上例的第 4 行
exec(i + " = []")
# 或者:
exec("{} = []".format(i))
# 或者:
exec(' '.join([i, '= []']))
이러한 작성 방법의 차이점은 문자열 접합 방법의 차이일 뿐입니다. 서로 다른 방법 사이에 대해서는 "Python에서 문자열을 연결하는 7가지 방법에 대한 자세한 설명"을 참조하세요.

Q 同学这个答案的核心在于 exec() 方法,它是内置的,用途是执行储存在字符串或文件中的代码段。

它的基础用法如下:

>>> exec('x = 1 + 2')
>>> x
3

# 执行代码段
>>> s = """
>>> x = 10
>>> y = 20
>>> sum = x + y
>>> print(sum)
>>> """
>>> exec(s)
30

看完了 exec() 的用法,我们再回来看 Q 同学的答案。for-循环中取出来的 i 是字符串,而拼接后的字符串经过 exec() 的处理,就获得了动态编写代码的效果。

也就是说,因为字符串常量的内容被当做有效代码而执行了,其中的 'A'-'D' 元素,就取得了新的身份,变成了最终的 A-D 变量名。

这个方法看起来很简单啊,可是由于 exec() 方法太生僻了,直到 Q 同学提出,我们才醒悟过来。

注意:在 Python3 中,exec() 是个内置方法;而在 Python2 中,exec 是个语句(statement),另外有个 execfile() 方法,两者相合并,就成了 Python3 中的 exec() 方法。本文使用的是 Python3。

4、总结

抽象一下最初的问题,它实际问的是“如何将字符串内容作为其它对象的变量名”,更进一步地讲是——“如何将常量转化为变量 ”。

使用直接进行赋值的静态方法,行不通。

两位同学提出的方法都是间接的动态方法:一个是动态地进行变量赋值,通过修改命名空间而植入变量;一个是动态地执行代码,可以说是通过“走后门”的方式,安插了变量。

两种方法殊途同归,不管是白猫还是黑猫,它们都抓到了老鼠。

这两种方法已经给我们带来了很有价值的启发,同时,因为它们,群内小伙伴们更是发散地讨论一些相关联的话题,例如:S 同学提出了另一种修改命名空间中变量的写法、L 同学提到了 eval() 的意义、eval() 与 exec() 的区别、我查到了为什么要慎用 eval() 、C 与 H 同学提到了 eval() 的安全用法……

위 내용은 Python에서 문자열 상수를 변수로 변환하는 방법은 무엇입니까? (예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제