목록에서 = 연산자의 예기치 않은 동작
다음 코드에 설명된 것처럼 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만 사용할 수 있으며 결과적으로 새 객체가 생성됩니다.
요약:
위 내용은 목록의 Python = 연산자가 예기치 않은 공유 상태 동작을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!