>>> def test():
... a.remove(1)
>>> a = [1,2]
>>> test()
>>> print a
[2]
왜 a
은 [1,2]
이 아닌 [2]
입니까?기본 파이썬. 함수가 목록을 변경하는 것을 금지하는 방법?
>>> def test():
... a.remove(1)
>>> a = [1,2]
>>> test()
>>> print a
[2]
왜 a
은 [1,2]
이 아닌 [2]
입니까?기본 파이썬. 함수가 목록을 변경하는 것을 금지하는 방법?
목록이 변경 가능합니다. 함수에 전달하고 함수가 변경하면 변경된 상태로 유지됩니다. a = (1,2)
b = list(a); b.remove(1)
- 지금 a
및 b
다른 내용이를 a
은 변경되지 않았습니다.또한 변경 가능한 전역 데이터를 사용하지 마십시오. 함수에 a
을 전달하거나 객체의 속성으로 a
을 가져 오거나 해당 메서드의 함수로 사용하십시오.
튜플을 변경 불가능한 목록으로 생각하면 안됩니다. 파이썬은 함수가하는 일을 제어하는 것이 아닙니다. 함수 doc 문자열은 매개 변수/전역 변수 등을 수정하는지 여부를 알려 주어야합니다. 따라서 복사본을 전달할 것을 제안하는 경우 +1하지만이 이유 때문에 변경 불가능한 구조로 전환하려면 -1을 반환해야합니다. –
@gnibbler : 변경 불가능한 구조를 사용하면 우발적 인 변경을 방지 할 수 있습니다. 파이썬에는 거의 모든 정적 검사가 없기 때문에 때로는 조금 방어가 필요할 수 있습니다. 또한 불변 구조는 쉽게 공유하고 재사용 할 수 있습니다. 가변 구조를 공유하는 것은 항상 더 까다 롭습니다. – 9000
원하는 것이 분명하지 않습니다. test() 함수는 전역 'a'목록을 수정하므로 'a'가 수정되는 것은 당연한 일입니다.
'test'가 a 대신에 직접 작업하도록하려면 먼저 복사 할 수 있습니다. 예를 들어
,def test():
a2 = list(a)
a2.remove(1)
목록은 변경할 수하기위한 것입니다, 변경 가능한 개체입니다. 변경 사항을 금지하려면 튜플 (예 : a = (1, 2)
)으로 변환하십시오. 튜플은 변경할 수 없으므로 변수를 복사하고 다시 할당하지 않으면 튜플을 변경할 수 없습니다.
목록이 a
이므로 전역 네임 스페이스에 있고 remove
을 호출하면 1
값이 제거됩니다.
수정하지 않으려면 새 목록을 만드십시오. a
목록에 remove
을 호출하면 물론 값을 제거 할 것입니다.
다음에 코드 서식을 사용하고 질문을 게시하기 전에 미리보기를보십시오. – AndiDog
이것은 전역 변수를 사용합니다. 아주 나쁜 생각입니다. 이전에 이런 코드 예제를 어디에서 보았습니까? –