2011-01-30 3 views
2
>>> def test(): 
... a.remove(1) 
>>> a = [1,2] 
>>> test() 
>>> print a 
[2] 

a[1,2]이 아닌 [2]입니까?기본 파이썬. 함수가 목록을 변경하는 것을 금지하는 방법?

+1

다음에 코드 서식을 사용하고 질문을 게시하기 전에 미리보기를보십시오. – AndiDog

+1

이것은 전역 변수를 사용합니다. 아주 나쁜 생각입니다. 이전에 이런 코드 예제를 어디에서 보았습니까? –

답변

6

목록이 변경 가능합니다. 함수에 전달하고 함수가 변경하면 변경된 상태로 유지됩니다. a = (1,2)

  • 원래 목록의 사본을 전달합니다 : 튜플 :
    • 는 불변의 구조를 사용 b = list(a); b.remove(1) - 지금 ab 다른 내용이를 a은 변경되지 않았습니다.

    또한 변경 가능한 전역 데이터를 사용하지 마십시오. 함수에 a을 전달하거나 객체의 속성으로 a을 가져 오거나 해당 메서드의 함수로 사용하십시오.

  • +1

    튜플을 변경 불가능한 목록으로 생각하면 안됩니다. 파이썬은 함수가하는 일을 제어하는 ​​것이 아닙니다. 함수 doc 문자열은 매개 변수/전역 변수 등을 수정하는지 여부를 알려 주어야합니다. 따라서 복사본을 전달할 것을 제안하는 경우 +1하지만이 이유 때문에 변경 불가능한 구조로 전환하려면 -1을 반환해야합니다. –

    +0

    @gnibbler : 변경 불가능한 구조를 사용하면 우발적 인 변경을 방지 할 수 있습니다. 파이썬에는 거의 모든 정적 검사가 없기 때문에 때로는 조금 방어가 필요할 수 있습니다. 또한 불변 구조는 쉽게 공유하고 재사용 할 수 있습니다. 가변 구조를 공유하는 것은 항상 더 까다 롭습니다. – 9000

    2

    원하는 것이 분명하지 않습니다. test() 함수는 전역 'a'목록을 수정하므로 'a'가 수정되는 것은 당연한 일입니다.

    'test'가 a 대신에 직접 작업하도록하려면 먼저 복사 할 수 있습니다. 예를 들어

    ,

    def test(): 
        a2 = list(a) 
        a2.remove(1) 
    
    0

    목록은 변경할 수하기위한 것입니다, 변경 가능한 개체입니다. 변경 사항을 금지하려면 튜플 (예 : a = (1, 2))으로 변환하십시오. 튜플은 변경할 수 없으므로 변수를 복사하고 다시 할당하지 않으면 튜플을 변경할 수 없습니다.

    0

    목록이 a이므로 전역 네임 스페이스에 있고 remove을 호출하면 1 값이 제거됩니다.

    수정하지 않으려면 새 목록을 만드십시오. a 목록에 remove을 호출하면 물론 값을 제거 할 것입니다.

    관련 문제