source

변수 작성 방법

nicesource 2022. 11. 14. 21:37
반응형

변수 작성 방법

Python에서 PHP 변수 이름과 동등한 이름을 만들려면 어떻게 해야 합니까?

하지만 전반적으로 좋지 않은 생각이라고 들었습니다.진짜예요?


기존 변수를 이름으로 검색하려고 할 경우 How do I select a variable by (string) name을 참조하십시오.다만, 우선, 이 질문의 어드바이스에 따라서, 그러한 요구를 회피하기 위해서 코드를 재구성할 수 있는지를 검토해 주세요.

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

>>> 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'
...

목록이 딕트보다 더 적절할 수 있습니다.목록은 개체의 순서를 정수 인덱스로 나타냅니다.

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

순서가 매겨진 시퀀스의 경우 리스트는 정수 키를 가진 딕트보다 편리합니다.목록은 인덱스 순서에서의 반복, 슬라이스,append'dict'는 'dict'를 말합니다.

내장된 함수를 사용하여 오브젝트의 속성을 이름으로 가져옵니다.필요에 따라서 이름을 변경합니다.

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

좋은 생각이 아니다.글로벌 변수에 액세스하는 경우 를 사용할 수 있습니다.

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

로컬 스코프의 변수에 액세스하려면 를 사용할 수 있지만 반환된 dict에는 값을 할당할 수 없습니다.

보다 나은 해결책은getattr또는 사전에 변수를 저장한 다음 이름으로 액세스합니다.

새로운 코드 작성자는 다음과 같은 코드를 작성할 수 있습니다.

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는, 「」라고 하는 것.set임의로 순서가 매겨진 물건의 가방, 또는dict련련 、 값함함포포경 경방경경 。

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

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

너는 글을 쓴다

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

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

globals()(설문: 이것은 잘못된 관행이지만, 당신의 질문에 대한 가장 간단한 답변입니다.허용된 답변과 같이 다른 데이터 구조를 사용해 주십시오.

수할 수 .i_1,i_2i_10:

for i in range(10):
    globals()['i_{}'.format(i)] = 'a'

이렇게 하면 이들 10개 변수 모두에 'a'가 할당됩니다.물론 동적으로 값을 변경할 수도 있습니다.글로벌하게 선언된 다른 변수와 마찬가지로 다음 모든 변수에 액세스할 수 있습니다.

>>> i_5
'a'

사전 대신 컬렉션 모듈에서 사용할 수도 있습니다. 이렇게 하면 액세스가 더 쉬워집니다.

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

# 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)

클래스는 새로운 Atribute를 만들기 위해 사용할 수 있습니다.setattr 서브클래스 " " " " " "SimpleNamespace자체 함수를 생성하여 새 속성 이름(예:)을 추가합니다.

from types import SimpleNamespace

variables = {"b":"B","c":"C"}
a = SimpleNamespace(**variables)
setattr(a,"g","G")
a.g = "G+"
something = a.a

오브젝트도 않은 할 수 .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

이 동작을 실현하려면 , 빌트인 방식을 사용할 필요가 있습니다.

def var_of_var(k, v):
    globals()[k] = v

print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print(variable_name) # 123

some_name = 'variable_name2'
var_of_var(some_name, 456)
print(variable_name2) # 456

질문에 대답하는 겁니다.문자열에 지정된 변수 이름을 가져오려면 어떻게 해야 합니까?이 질문의 링크와 중복으로 닫힙니다.

문제의 변수가 객체의 일부(예를 들어 클래스의 일부)인 경우 다음과 같은 기능을 수행하는 데 도움이 되는 함수는 다음과 같습니다.hasattr,getattr , , , , 입니다.setattr

예를 들어 다음과 같은 것이 있습니다.

class Variables(object):
    def __init__(self):
        self.foo = "initial_variable"
    def create_new_var(self,name,value):
        setattr(self,name,value)
    def get_var(self,name):
        if hasattr(self,name):
            return getattr(self,name)
        else:
            raise("Class does not have a variable named: "+name)

다음 작업을 수행할 수 있습니다.

v = Variables()
v.get_var("foo")

"initial_interial"

v.create_new_var(v.foo,"is actually not initial")
v.initial_variable

"실제로 첫 번째가 아닙니다"

# Python 3.8.2 (default, Feb 26 2020, 02:56:10)

Python 변수

"""
<?php
$a = 'hello';
$e = 'wow'
?>
<?php
$$a = 'world';
?>
<?php
echo "$a ${$a}\n";
echo "$a ${$a[1]}\n";
?>
<?php
echo "$a $hello";
?>
"""

a = 'hello'  #<?php $a = 'hello'; ?>
e = 'wow'   #<?php $e = 'wow'; ?>
vars()[a] = 'world' #<?php $$a = 'world'; ?>
print(a, vars()[a]) #<?php echo "$a ${$a}\n"; ?>
print(a, vars()[vars()['a'][1]]) #<?php echo "$a ${$a[1]}\n"; ?>
print(a, hello) #<?php echo "$a $hello"; ?>

출력:

hello world
hello wow
hello world

globals(), locals() 또는 vars()를 사용해도 동일한 결과가 생성됩니다.

# Python 3.8.2 (default, Feb 26 2020, 02:56:10)

#<?php $a = 'hello'; ?>
#<?php $e = 'wow'; ?>
#<?php $$a = 'world'; ?>
#<?php echo "$a ${$a}\n"; ?>
#<?php echo "$a ${$a[1]}\n"; ?>
#<?php echo "$a $hello"; ?>

print('locals():\n')
a = 'hello'
e = 'wow'
locals()[a] = 'world'
print(a, locals()[a])
print(a, locals()[locals()['a'][1]])
print(a, hello)

print('\n\nglobals():\n')
a = 'hello'
e = 'wow'
globals()[a] = 'world'
print(a, globals()[a])
print(a, globals()[globals()['a'][1]])
print(a, hello)

출력:

locals():

hello world
hello wow
hello world


globals():

hello world
hello wow
hello world

보너스(문자열에서 변수 생성)

# Python 2.7.16 (default, Jul 13 2019, 16:01:51)
# [GCC 8.3.0] on linux2

변수 생성 및 태플 풀기:

g = globals()
listB = []
for i in range(10):
    g["num%s" % i] = i ** 10
    listB.append("num{0}".format(i))

def printNum():
    print "Printing num0 to num9:"
    for i in range(10):
        print "num%s = " % i, 
        print g["num%s" % i]

printNum()

listA = []
for i in range(10):
    listA.append(i)

listA = tuple(listA)
print listA, '"Tuple to unpack"'

listB = str(str(listB).strip("[]").replace("'", "") + " = listA")

print listB

exec listB

printNum()

출력:

Printing num0 to num9:
num0 =  0
num1 =  1
num2 =  1024
num3 =  59049
num4 =  1048576
num5 =  9765625
num6 =  60466176
num7 =  282475249
num8 =  1073741824
num9 =  3486784401
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) "Tuple to unpack"
num0, num1, num2, num3, num4, num5, num6, num7, num8, num9 = listA
Printing num0 to num9:
num0 =  0
num1 =  1
num2 =  2
num3 =  3
num4 =  4
num5 =  5
num6 =  6
num7 =  7
num8 =  8
num9 =  9

python 3.7.3에서 둘 다 시도해 봤는데 globals() 또는 vars() 중 하나를 사용할 수 있습니다.

>>> food #Error
>>> milkshake #Error
>>> food="bread"
>>> drink="milkshake"
>>> globals()[food] = "strawberry flavor"
>>> vars()[drink] = "chocolate flavor"
>>> bread
'strawberry flavor'
>>> milkshake
'chocolate flavor'
>>> globals()[drink]
'chocolate flavor'
>>> vars()[food]
'strawberry flavor'


★★★★★★★★★★★★★★★★★★:
https://www.daniweb.com/programming/software-development/threads/111526/setting-a-string-as-a-variable-name#post548936httpswww.daniweb.com/programming/software-development/threads/111526/#post548936

이에 대해서는 사전을 사용하기로 합의했습니다. 다른 답을 참조하십시오.이것은 대부분의 경우 좋은 생각입니다만, 이것으로부터 생기는 여러가지 측면이 있습니다.

  • 가비지 컬렉션 등 이 딕셔너리에 대한 책임은 사용자에게 있습니다.
  • 변수 변수에는 지역성 또는 전역성이 없습니다. 사전의 전역성에 따라 다릅니다.
  • 변수 이름을 변경하려면 수동으로 변경해야 합니다.
  • 하지만, 당신은 훨씬 더 유연합니다.
    • 기존 변수를 덮어쓸지 여부를 결정할 수 있습니다.
    • ... const 변수 구현 선택
    • 다른 종류의 덮어쓰기에 대해 예외를 두다
    • 기타.

즉, 위의 아이디어 중 일부를 제공하는 변수 관리자 클래스를 구현했습니다.python 2와 3에서 동작합니다.

수업은 다음과 같이 사용할 수 있습니다.

from variableVariablesManager import VariableVariablesManager

myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])

# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
    myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
    print("not allowed")
except AttributeError as e:
    pass

# rename a variable
myVars.renameVariable('myconst', 'myconstOther')

# preserve locality
def testLocalVar():
    myVars = VariableVariablesManager()
    myVars['test'] = 13
    print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])

# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
    myVars = VariableVariablesManager()
    print("inside function myVars['globalVar']:", myVars['globalVar'])
    myVars['globalVar'] = 13
    print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])

같은 유형의 변수만 덮어쓸 수 있도록 하려면 다음 절차를 수행합니다.

myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)

모든 변수 집합을 클래스로 정리할 수도 있습니다.__dict__ 속성을 통해 빌트인 사전에 직접 액세스하여 런타임 중에 클래스 인스턴스에 변수를 추가할 수 있습니다.

다음 코드는 변수 클래스를 정의하며, 이 경우 구성 중에 해당 인스턴스에 변수(이 경우 속성)를 추가합니다.변수 이름은 지정된 목록에서 가져옵니다(예: 프로그램 코드로 생성되었을 수 있음).

# some list of variable names
L = ['a', 'b', 'c']

class Variables:
    def __init__(self, L):
        for item in L:
            self.__dict__[item] = 100

v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100

아주 위험할 거야...exec()을 사용할 수 있습니다.

a = 'b=5'
exec(a)
c = b*2
print (c)

결과: 10

setattr() 메서드는 지정된 객체의 지정된 속성 값을 설정합니다.

구문은 다음과 같습니다.

setattr(object, name, value)
Example –

setattr(self,id,123)

은 와와다다 which에 해당합니다.self.id = 123

관찰한 바와 같이 setattr()에서는 새로운 Atribute를 생성 또는 변경하기 위해 객체가 값과 함께 전달될 것으로 예상합니다.

setattr()를 회피책과 함께 사용하면 모듈 내에서 사용할 수 있습니다.여기 방법 –

import sys
x = "pikachu"
value = 46
thismodule = sys.modules[__name__]
setattr(thismodule, x, value)
print(pikachu)

언급URL : https://stackoverflow.com/questions/1373164/how-do-i-create-variable-variables

반응형