>백엔드 개발 >파이썬 튜토리얼 >목록의 Python = 연산자가 예기치 않은 공유 상태 동작을 생성하는 이유는 무엇입니까?

목록의 Python = 연산자가 예기치 않은 공유 상태 동작을 생성하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-14 17:08:18875검색

Why Does Python's  = Operator on Lists Produce Unexpected Shared-State Behavior?

목록에서 = 연산자의 예기치 않은 동작

다음 코드에 설명된 것처럼 Python의 = 연산자는 목록에서 작업할 때 예기치 않은 동작을 나타냅니다. snippet:

class foo:
    bar = []
    def __init__(self, x):
        self.bar += [x]


class foo2:
    bar = []
    def __init__(self, x):
        self.bar = self.bar + [x]

f = foo(1)
g = foo(2)
print(f.bar)
print(g.bar)

출력:

[1, 2]
[1, 2]

= 연산자는 클래스의 모든 인스턴스에 영향을 미치는 것으로 보이지만 foo = foo bar는 예상대로 작동합니다.

이 동작은 = 연산자의 기본 구현에서 비롯됩니다. 먼저 내부 추가를 위한 특수 메서드인 iadd를 호출하고 해당 메서드가 작동하는 개체를 수정하려고 시도합니다. iadd를 사용할 수 없는 경우 새 개체를 반환하는 add 특수 메서드로 대체됩니다.

목록의 경우 add이 정의되어 새 목록을 반환합니다. 따라서 =를 목록에 사용하면 기존 목록을 변경하는 대신 새 목록을 생성합니다. 이것이 위의 예에서 f와 g가 동일한 막대 목록을 공유하는 이유를 설명합니다.

= 연산자는 변경 가능한 객체에 대해 다르게 동작하며,

iadd 메서드를 통해 해당 위치에서 객체를 수정합니다. 문자열 및 정수와 같은 불변 객체의 경우 add만 사용할 수 있으며 결과적으로 새 객체가 생성됩니다.

요약:

    = 정의된 경우
  • iadd를 사용하여 객체 수정 in-place.
  • iadd가 정의되지 않은 경우 =는 __add__로 대체되어 새 객체를 생성합니다.
  • 변경 가능한 객체의 경우 =는 객체를 in-place로 수정합니다. .
  • 불변 객체의 경우 =는 새 객체를 생성합니다.

위 내용은 목록의 Python = 연산자가 예기치 않은 공유 상태 동작을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.