2017-11-24 4 views
-1

나는 다음과 같은 코드를 가지고있는 변수 할당과 기능 :목록, 파이썬

def proc2(p): 
    p=p+[1] 
y=[2,5] 
proc2(y) 
print(y) 


z=[2,5] 
z=z+[1] 
print(z) 

코드의 출력은이 :

[2, 5] 
[2, 5, 1] 

나는 y는하지 입니다 [2,5,1]을 수정 한 것으로 알고 있습니다. 그러나 y는 이고 새로운 목록은입니다. [2,5,1]입니다. 맞습니까? 그런데 y가 원래 값을 계속 참조하는 이유는 무엇입니까? z의 값이 변경되면 y가 아닌 이유는 무엇입니까?

P. 나는 방금 이것과 거의 같은 question을 물었다. 이 질문은 다른 질문의 사본으로 표시되었습니다. 그러나, 나는 그들이 조금 다르다고 생각한다. 그래서 내 질문을 다시 게시하고 있습니다. 나는 내가 기능에 관해 무엇인가 놓쳤음에 틀림 없었다라고 생각한다.

+0

()'의'p'리스트 p'는 긴리스트에 재배치되는 '다음 첨부된다. 언급했듯이 이것은 여전히 ​​짧은 목록을 가리키는'y'에는 영향을 미치지 않습니다. 그러나 두 번째 예제에서 'z'는 실제로 추가 목록을 가리 키도록 다시 할당됩니다. – Phylogenesis

+1

'z'에 실제로 할당 된 원래 목록의 값은 * 변경되지 않았습니다. 더 이상 참조하지 않는 것입니다. 예를 들면 'old_z = z' * before *'z + = 1', 그리고 나서'old_z'를 출력하면 알 수 있습니다. 행동에는 차이가 없습니다. – jonrsharpe

+0

'p = p + [1]'은 이전에 참조했던리스트를 수정하지 않습니다. _variable_'p'를 수정하여 새로운리스트를 참조합니다. _old_ 목록을 계속 참조하는 다른 변수는 영향을받지 않습니다. – khelwood

답변

0

Y는 새 목록

아니, 코드에서 하나의 y = ... 할당 거기에 재 할당된다. 함수가 실행될 때 어떻게됩니까

은 다음

# implicitly: assign formal parameter name to actual argument value 
p = y 

# compute p + [1] => [2, 5, 1] 
# assign the result to the name p 
p = p + [1] 

# aaaand... nothing from here on. 

그래서 당신의 함수는 결과 (새 목록) 기능 범위 내에서 이름 p을 할당 한 다음 p는 가능한 한 빨리 손실을 계산 함수가 종료됩니다.

이 입력 목록을으로 변경하는 함수를 작성하지 않으려면 계산 된 값을 반환하고 y을 다시 할당하여 원하는 효과를 확인해야합니다.

>>> def proc2(y): 
...  y = y + [1] 
... 
>>> y = [2,5] 
>>> proc2(y) 
>>> y 
[2, 5] 

마지막으로, 수 : 당신 이 함수 내에서y = ... 할당을 한 경우에도

>>> def proc2(p): 
...  p = p + [1] 
...  return p 
... 
>>> y = [2,5] 
>>> y = proc2(y) 
>>> y 
[2, 5, 1] 

참고, 그 이름은 상관하지 않을 기능과 외부 범위 로컬 것은 파이썬에게 함수 몸체 안에있는 글로벌 y을 의미한다고 알려주지 만, 이는 잘못된 스타일 (여기와 다른 대부분의 경우)으로 간주됩니다.

+0

"입력 목록을 변경하는 함수를 작성하지 않으려는 경우"를 제외하고 나는 당신이 말한 것에 모두 동의합니다. @jonrsharpe가 언급 한 것과 마찬가지로'p '에 할당 된 원래리스트의 값, 즉 입력리스트 [2, 5]는 실제로 변경되지 않았다. 그것은 단지'p'가 다른 목록 [2, 5, 1]에 재 할당되었습니다. 동의하니? – failbetter

+0

@failbetter 원래 함수가 입력 목록을 변경한다고 결코 주장하지 않았습니다. 입력 인자를 변경하지 않는 한, 함수가 유용한 것을하기 위해 값을 반환해야한다고 말하고 싶다. – timgeb

+1

알았습니다. 감사. – failbetter

0

함수에 로컬 인 변수 p를 변경했기 때문에 변수 y가 변경되지 않습니다. 이 변수는 함수가 끝난 후 y와 아무런 관련이 없습니다.

0

두 가지 옵션 :

  1. 어느 함수가 새 목록 반환이 :

    def proc2(p): 
        return p + [1] 
    
  2. 또는, 그것은 p현재 위치에서 수정 (선택적 청소기를 반환해야 코딩) :

    def proc2(p): 
        p += [1] # this is not exactly the same as p = p + [1] 
        return p # <- optional! 
    

코드는 기존 p을 수정하는 대신 외부 범위와 통신하지 않는 새 코드를 만듭니다. 그 결과로 함수가 종료 될 때 이됩니다.

0

여기에서 일어나는 일을 더 잘 이해하려면 z와 y의 ID를 확인하십시오. 이는 서로 다르므로 z와 y가 다른 개체라는 것을 의미합니다. 둘 중 하나를 변경해도 다른 하나에는 영향을주지 않습니다. PROC2 '에서

y=[1,2] z=[1,2] print id(y), id(z)