변수 수의 변수를 작성하는 방법 파이썬에서 변수 변수를 어떻게 달성합니까?

파이썬에서 변수 변수를 어떻게 달성합니까?

다음은 정교한 수동 항목입니다. 변수 변수

나는 이것이 일반적으로 나쁜 생각이라고 들었고, 파이썬의 보안 구멍입니다. 그게 사실입니까?



답변

사전 을 사용 하여이를 수행 할 수 있습니다 . 사전은 키와 값의 저장소입니다.

>>> dct = {'x': 1, 'y': 2, 'z': 3}
>>> dct
{'y': 2, 'x': 1, 'z': 3}
>>> dct["y"]
2

변수 키 이름을 사용하여 보안 위험없이 변수 변수의 효과를 얻을 수 있습니다.

>>> x = "spam"
>>> z = {x: "eggs"}
>>> z["spam"]
'eggs'

다음과 같은 일을 생각하는 경우

var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...

dict보다 목록이 더 적합 할 수 있습니다. 목록은 정수 인덱스를 사용하여 순서가 지정된 객체 시퀀스를 나타냅니다.

lst = ['foo', 'bar', 'baz']
print(lst[1])           # prints bar, because indices start at 0
lst.append('potatoes')  # lst is now ['foo', 'bar', 'baz', 'potatoes']

리스트는 인덱스 순서에 반복을 지원하기 때문에 명령 시퀀스를 들어, 목록, 정수 키 dicts보다 더 편리 슬라이스 , append사전인가와 어색한 키 관리를 필요로하고, 다른 작업.


답변

내장 getattr함수를 사용하여 이름으로 객체의 속성을 가져옵니다. 필요에 따라 이름을 수정하십시오.

obj.spam = 'eggs'
name = 'spam'
getattr(obj, name)  # returns 'eggs'

답변

좋은 생각이 아닙니다. 전역 변수에 액세스하는 경우 사용할 수 있습니다 globals().

>>> a = 10
>>> globals()['a']
10

로컬 범위의 변수에 액세스하려면을 사용할 수 locals()있지만 반환 된 dict에 값을 할당 할 수 없습니다.

더 좋은 해결책getattr변수를 사전에 사용 하거나 저장 한 다음 이름으로 변수에 액세스하는 것입니다.


답변

변수 변수를 사용할 때마다 사전을 사용하는 것이 좋습니다. 그래서 글을 쓰는 대신

$foo = "bar"
$$foo = "baz"

당신은 쓰기

mydict = {}
foo = "bar"
mydict[foo] = "baz"

이렇게하면 실수로 기존 변수 (보안 측면)를 덮어 쓰지 않으며 다른 “네임 스페이스”를 가질 수 있습니다.


답변

새로운 코더는 때때로 다음과 같은 코드를 작성합니다.

my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...

그런 다음 코더에는 O ( m * n ) 의 코딩 노력으로 명명 된 변수 더미가 남습니다 . 여기서 m 은 명명 된 변수의 수이고 n 은 변수 그룹에 액세스해야하는 횟수입니다 (생성 포함). ). 좀 더 초보자는 각 라인의 유일한 차이점은 규칙에 따라 변경되는 숫자이며 루프를 사용하기로 결정한다는 것을 알 수 있습니다. 그러나 변수 이름을 동적으로 만드는 방법을 고수하고 다음과 같이 시도 할 수 있습니다.

for i in range(10):
    my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)

그들은 곧 이것이 효과가 없다는 것을 알게되었습니다.

프로그램에 임의의 변수 “이름”이 필요한 경우 다른 답변에서 설명한대로 사전이 최선의 선택입니다. 그러나 단순히 많은 변수를 만들려고하고 정수 시퀀스로 변수를 참조하지 않는다면 아마도을 찾고있을 것입니다 list. 일일 온도 측정 값, 주별 퀴즈 점수 또는 그래픽 위젯 그리드와 같이 데이터가 균일 한 경우 특히 그렇습니다.

다음과 같이 조립할 수 있습니다.

my_calculator.buttons = []
for i in range(10):
    my_calculator.buttons.append(tkinter.Button(root, text=i))

이것은 list이해력을 가지고 한 줄로 만들 수도 있습니다.

my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]

두 경우 모두 결과는 채워 list지고 첫 번째 요소는로 액세스 my_calculator.buttons[0]하고 다음 요소는로 액세스 my_calculator.buttons[1]됩니다. “기본”변수 이름은의 이름이되고 변수 list에 액세스하는 데 다양한 식별자가 사용됩니다.

마지막으로 다음과 같은 다른 데이터 구조를 잊지 마십시오. set이는 각 “이름”에 값이 첨부되어 있지 않다는 점을 제외하고는 사전과 유사합니다. 단순히 물건의 “가방”이 필요하다면, 이것은 훌륭한 선택이 될 수 있습니다. 이와 같은 대신 :

keyword_1 = 'apple'
keyword_2 = 'banana'

if query == keyword_1 or query == keyword_2:
    print('Match.')

당신은 이것을 가질 것입니다 :

keywords = {'apple', 'banana'}
if query in keywords:
    print('Match.')

를 사용하여 list유사한 일련의 객체, A의 set임의의 정렬 된 객체의 가방, 또는에 대한 dict관련 값 이름의 가방.


답변

사전 대신 namedtuplecollections 모듈에서 사용할 수 있으므로 액세스가 더 쉽습니다.

예를 들면 다음과 같습니다.

# using dictionary
variables = {}
variables["first"] = 34
variables["second"] = 45
print(variables["first"], variables["second"])

# using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print(vars.first, vars.second)

답변

객체를 사용하지 않으려면 setattr()현재 모듈 내부에서 계속 사용할 수 있습니다 .

import sys
current_module = module = sys.modules[__name__]  # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15)  # 15 is the value you assign to the var
print(variable_name)  # >>> 15, created from a string