복붙노트

[PYTHON] 변수가 이미 정의 된 후에 변수를 변경하는 방법은 무엇입니까?

PYTHON

변수가 이미 정의 된 후에 변수를 변경하는 방법은 무엇입니까?

추가하거나 정의 된 변수에서 빼기 위해 노력하고있어,하지만 어떻게 새 값으로 이전 값을 덮어 씁니다 알아낼 수 없습니다.

a = 15

def test():
    a = a +10
    print ( a )

test()

에러 메시지:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test()
  File "test.py", line 4, in test
    a = a +10
UnboundLocalError: local variable 'a' referenced before assignment

해결법

  1. ==============================

    1.코드를 실행하려고 할 때 발생하는 오류는 다음과 같습니다.

    코드를 실행하려고 할 때 발생하는 오류는 다음과 같습니다.

    UnboundLocalError: local variable 'a' referenced before assignment
    

    ... 그것의 얼굴에, 이상하게 보입니다 : 결국, 위의 코드 (a = 15)의 첫 문장은 과제입니다. 그래서, 무슨 일 이니?

    사실 두 가지 일이 일어나고 있으며, 두 가지가 이미 알지 못한다면 분명하지 않습니다.

    우선, 실제로 두 가지 변수가 있습니다.

    이 두 변수는 이름이 같더라도 완전히 서로 관련이 없습니다.

    변수는 해당 함수 내부에 지정하는 명령문 (예 : a = a +10 행)이있는 경우 함수에 대해 국지적입니다.

    그럼에도 불구하고 오류는 여전히 이상하게 보입니다. 결국, 당신이 test () 내에서 제일 먼저하는 일은 a에 할당되기 때문에 어떻게 미리 참조 할 수 있습니까?

    답은 할당 문에서 파이썬은 = 기호의 오른쪽에있는 모든 것을 왼쪽에있는 이름에 할당하기 전에 평가한다는 것입니다. 따라서 할당이 코드에 처음 쓰여지더라도 먼저 a가 참조됩니다 그 오른쪽에 : +10.

    이 문제를 해결할 수있는 방법은 두 가지가 있습니다. 첫 번째는 파이썬에게 당신이 정말로 내부 테스트 ()가 전역 범위에서 똑같아 지길 원한다는 것입니다 :

    def test():
        global a
        a = a + 10
        print(a)
    

    이것은 효과가 있지만 프로그램을 작성하는 것은 매우 나쁜 방법입니다. 함수 내에서 전역 변수를 변경하는 것은 대개 많은 기능을 가지고 있기 때문에 실제로 신속하게 관리하기가 어렵습니다. 아무도 예상하지 못하는 방식으로 전역 변수를 엉망으로 만들지는 못합니다.

    더 좋은 방법은 다음과 같이 변수를 함수에 인수로 전달하는 것입니다.

    a = 15
    
    def test(x):
        x = x + 10
        print(x)
    
    test(a)
    

    이름이 동일 할 필요는 없다는 것을주의하십시오. test ()의 새로운 정의는 단지 값을 받아들이는 것을 말한 다음 그 값으로 무언가를합니다. 당신은 당신이 좋아하는 어떤 것을 건네 줄 수 있습니다. 그것은 a 나 7이나 다른 것일 수 있습니다. 사실, 다른 범위에서 같은 이름의 변수를 사용하지 않으려 고하면 코드를 더 쉽게 이해할 수 있습니다.

    위의 코드를 사용하면 흥미로운 것을 알 수 있습니다.

    >>> a = 15
    >>> test(a)
    25
    >>> a
    15
    

    ... 변하지 않았어! 왜냐하면 당신이 test ()에 그것을 전달했지만 그것이 x에 할당 되었기 때문에 x가 변경되어 원래의 것을 혼자 남겨 두었 기 때문입니다.

    실제로 a를 변경하려면 수정 된 x를 함수에서 반환 한 다음 외부에 다시 ​​할당해야합니다.

    >>> a = 15
    >>> 
    >>> def test(x):
    ...     x = x + 10
    ...     print(x)
    ...     return x
    ... 
    >>> a = test(a)
    25
    >>> a
    25
    
  2. ==============================

    2.함수 test ()의 범위에서 작성된 변수 a를 수정하고 있습니다. outter a를 수정하려면 다음을 수행하십시오.

    함수 test ()의 범위에서 작성된 변수 a를 수정하고 있습니다. outter a를 수정하려면 다음을 수행하십시오.

    a = 15
    
    def test():
        global a
        a = a + 1
        print(a)
    
    test()
    
  3. ==============================

    3.나는 이렇게 할 것입니다.

    나는 이렇게 할 것입니다.

    def test(a):
        a = a +10
        return a
    
    print(test(15))
    

    제안 된 버전에는 귀하와 다른 점이 있습니다.

    첫째, 필자가 쓴 내용은 입력 값으로 a 값을 가진 함수를 작성한 것입니다 (이 경우 마지막 행에서 이미 정의 된 함수를 호출하면 15로 설정 됨). 그런 다음 객체 a에 값을 할당합니다 a (15)에 10을 더한 다음, a를 리턴하고 (이는 수정되었으며 현재는 25입니다) 마지막으로 코드의 마지막 줄을 빌어 감사드립니다.

    print(test(15))
    

    당신이 한 일은 말하자면 실제로는 순수한 기능이 아니 었습니다. 일반적으로 함수는 입력 값 (또는 여러 개)을 가져 와서 입력 값 (또는 여러 개)을 반환하기를 원합니다. 귀하의 경우에는 입력 값이 실제로 비어 있고 출력 값이 없습니다 (반환 값을 사용하지 않았으므로). 게다가,이 입력을 함수 외부에 작성하려고했습니다 (테스트 (a) 값을로드하지 않았을 때 오류가 컴퓨터의 눈에 띄었습니다. "비어 있음"). .

    또한 함수 내에서 리턴 값을 쓰는 것에 익숙해지기를 권합니다. (마지막 코딩 라인에서 print (test (15))와 같이) 함수 내에서 사용하는 대신 . 함수를 호출 할 때만 print를 사용하는 것이 더 좋으며 함수가 실제로 무엇을하는지 보길 원합니다.

    적어도, 이것은 그들이 기본 프로그래밍 수업에서 보여준 방식입니다. 이것은 다음과 같이 정당화 될 수 있습니다. 함수 내에서 return을 사용하는 경우 함수는 나중에 다른 함수에서 사용할 수있는 값을 제공합니다 (즉 함수는 사용자가 사용할 수있는 값을 반환합니다). 그렇지 않으면 화면에 인쇄 된 숫자 만 표시되지만 컴퓨터는 더 이상 사용할 수 없습니다.

    추신 다음과 같이 할 수도 있습니다.

    def test(a):
        a +=10      
        return a
    
    print(test(15))
    
  4. ==============================

    4.키워드 global을 사용하여 명시 적으로 정의하지 않는 한 변수의 범위는 블록에 국한됩니다. globals 함수를 사용하여 함수에 대한 전역 변수에 액세스하는 다른 방법이 있습니다.

    키워드 global을 사용하여 명시 적으로 정의하지 않는 한 변수의 범위는 블록에 국한됩니다. globals 함수를 사용하여 함수에 대한 전역 변수에 액세스하는 다른 방법이 있습니다.

    a = 15
    
    def test():
        a = globals()['a']
        a += 10
        print ( a )
    
    test()
    

    위의 예에서는 전역 값을 그대로 유지하면서 25를 인쇄합니다 (예 : 15).

  5. ==============================

    5.

    # All the mumbo jumbo aside, here is an experiment 
    # to illustrate why this is something useful 
    # in the language of Python:
    a = 15    # This could be read-only, should check docs
    
    def test_1():
        b = a + 10    # It is perfectly ok to use 'a'
        print(b)
    
    def test_2():
        a = a + 10    # Refrain from attempting to change 'a'
        print(a)
    
    test_1()    # No error
    test_2()    # UnboundLocalError: ...
    
  6. ==============================

    6.당신의 오류는 이미 정의되고있는 것과 아무 상관이 없습니다 ... 변수는 범위 내에서만 유효합니다. 범위 : 변수를 함수에 만들면이 함수에서만 정의됩니다.

    당신의 오류는 이미 정의되고있는 것과 아무 상관이 없습니다 ... 변수는 범위 내에서만 유효합니다. 범위 : 변수를 함수에 만들면이 함수에서만 정의됩니다.

    def test():
       x=17
       print(x) # returns 17
    
    test()
    print(x) # results in an error.
    
  7. from https://stackoverflow.com/questions/41369408/how-to-change-a-variable-after-it-is-already-defined by cc-by-sa and MIT license