2010-12-10 4 views
0

사람들을 인수를 전달 난 함수를 다음 코드로파이썬 함수에

에 가변 객체를 전달하는 방법에 대한 질문을 가지고, 나는, 출력 [0,0,0]이 될 것으로 예상했다 [0,1,2,3]

실제로 인수가 복사 된 다음 함수 내부로 보내지는 것을 의미합니까?

def lala(a): 
    n = [0, 0 , 0] 
    a = n 

a = [0,1,2,3] 

lala(a) 

print a 

위의 작업을 함수 내부에서 수행하려면 어떻게 우아하게 작성해야합니까?

대단히 감사합니다!

답변

8

파이썬이 더 의미가 당신이 이름을 부착 생각하면 태그를 객체에 채우는 대신 객체를 이름이 지정된 상자에 채우기 만하면됩니다.

def lala(a): 
    n = [0, 0 , 0] 
    a = n 

여기에 있습니다.

  1. 매개 변수 (이 경우 목록)를 수신하고 이름을 a으로 지정하고 있습니다.
  2. 새 목록을 만들고 이름을 n으로 지정합니다.
  3. n이라는 이름의 목록에 추가 이름 a을 제공하고 있습니다.
  4. an이라는 두 가지 이름은 lala 함수에 국한되어 있으므로 함수가 끝나면 "만료"됩니다.
  5. 함수에서 작성한 목록에는 이름이 없으므로 파이썬이 삭제합니다.

즉, a은 새 목록을 추가 할 수있는 상자가 아닙니다. 당신이받은 명단을 당신이 지은 이름입니다. 나중에이 이름을 n이라는 목록에 다시 지정합니다.

다른 사람들은 슬라이스 지정 a[:] = n을 제안했는데, 목록 자체가 아닌 목록의 항목에 대한 참조를 사용합니다. 이렇게하면 a이라는 이름은 여전히 ​​같은 목록을 가리 킵니다. 그 내용이 방금 대체되었습니다. 함수에 전달 된 목록과 같기 때문에 함수 외부에 알려진 모든 이름이 새 내용을 "보게"됩니다.

0

주 함수의 차이,이 하나를 함수가 "A"의 범위에 대한 새 레이블을 만들기 때문에입니다

def lala(a): 
    a[0] = 7 

a = [0,1,2,3] 
lala(a) 
print a # prints [7, 1, 2, 3] 
1

. 그런 다음이 "a"는 함수 외부에서 정의한 "a"를 능가합니다.

def lala(a): 
    a.pop() 

a = [0,1,2,3,4] 
lala(a) 
print(a) 

당신은 (즉, A = [0, 1, 2, 3] 때문에 팝업을 볼 것입니다 : 당신이 쓰는한다면 그래서 새 레이블 A는 새로운 객체 [0,0,0,0] 에 할당)는 실제로 레이블 'a'가 가리키는 객체를 변경합니다. (할당이 레이블이 지정된 객체로 변경되는 동안)

2

a[:] = n을 함수 내에 사용할 수 있습니다. 이를 슬라이스 지정이라고합니다.

2

파이썬에는 참조 호출 기능이 없습니다. 이렇게하는 일반적인 방법은 없습니다. 당신이 당신의 인수 목록이 될 것입니다 알고, 당신이 다른 값을하려면

, 그렇게처럼 쓸 수 있습니다 :

def lala(a): 
    a[:] = [0,0,0] 
3

kindall 내 의견으로는 커다란 설명을주었습니다. 그러나 이와 같은 일을하기 위해 제가 선호하는 방법은 참조를 망칠 대신 변경을 반환하는 것입니다.

def lala(): 
    n = [0, 0, 0] 
    return n 

a = [0, 1, 2, 3] 

a = lala() 

print a # prints [0, 0, 0] 
+0

네, 그게 아주 좋습니다! – kindall

관련 문제