내 질문은: 첫 번째 코드에서 인쇄된 두 결과는 다르지만 두 번째 코드에서 인쇄된 결과는 동일한 이유는 무엇입니까? 특히 두 번째 코드 부분에서는 함수의 추가 명령이 외부 전역 변수를 수정할 수 있는 이유를 설명합니다. 첫 번째 코드에서는 목록이 재정의되었지만 외부 전역 변수는 수정할 수 없습니까? 여기에 이유가 무엇입니까?
허용된 답변을 읽은 후에도 여전히 요점을 놓친 것 같습니다. 먼저 nums 변수는 전역 변수로 정의되어 있는데, 이는 이 ".py" 파일에서 모든 클래스와 함수가 이를 사용할 수 있다는 의미입니다. 그러나 모든 변수는 객체이기도 하며 객체는 가변(mutable)과 불변(immutable)으로 나뉩니다. 목록은 변경 가능한 개체이므로 변경될 수 있습니다. 그렇다면 가변 객체란 무엇일까요? 그것들은 기억 속의 창조와 죽음에 영향을 주지 않고 물체에 작용할 수 있는 것들입니다. x="234"를 입력하고, 다른 값을 지정하면 x="111"이 됩니다. 사실, 두 개의 x는 이미 두 개의 객체이고 단지 덮여 있을 뿐입니다. 즉, x = x + "123"이고 x도 새로운 객체입니다.
목록인 경우 x = [1,2,3], 이제 x.remove(1)에 대해 연산을 수행하면 x 개체는 여전히 x 개체이지만 개체의 값이 변경되었습니다
첫 번째 코드 부분: 재할당입니다. 다른 범위에서는 nums가 다시 할당되므로 전역 변수 nums와 nums_chang 함수의 nums 변수는 더 이상 동일하지 않으므로 서로 다릅니다. 현재 nums_chang 함수의 nums 변수는 이미 로컬 변수이며 이 함수에서만 사용됩니다
두 번째 코드 조각: nums는 목록이자 변수 개체이므로 목록에 대한 작업은 이 개체에 영향을 주지 않으므로 이 개체는 여전히 전역 변수가 함수 내부와 외부 모두에서 사용됩니다. 수정하면 전역 변수의 값도 수정됩니다
먼저: 범위 문제에 관해 내 기사 중 하나를 먼저 참조할 수 있습니다. Python: Scope 및 LEGB, 먼저 비교할 수 있습니다. 变量的查找有个基本的认识,然后我们能够看到, 因为有赋值语句, 所以nums로컬 범위에서만 검색하고 전역 도메인 문제와 상호 작용하지 않습니다.
두 번째: 첫 번째를 바탕으로 nums.append(999)中的nums是从全局作用域找到的, 又因为用的是append方法, 这方法是直接用于源列表本身, 所以你看到全局的nums또한 업데이트되었음을 알 수 있습니다
허용된 답변을 읽은 후에도 여전히 요점을 놓친 것 같습니다.
먼저 nums 변수는 전역 변수로 정의되어 있는데, 이는 이 ".py" 파일에서 모든 클래스와 함수가 이를 사용할 수 있다는 의미입니다. 그러나 모든 변수는 객체이기도 하며 객체는 가변(mutable)과 불변(immutable)으로 나뉩니다. 목록은 변경 가능한 개체이므로 변경될 수 있습니다. 그렇다면 가변 객체란 무엇일까요? 그것들은 기억 속의 창조와 죽음에 영향을 주지 않고 물체에 작용할 수 있는 것들입니다. x="234"를 입력하고, 다른 값을 지정하면 x="111"이 됩니다. 사실, 두 개의 x는 이미 두 개의 객체이고 단지 덮여 있을 뿐입니다. 즉, x = x + "123"이고 x도 새로운 객체입니다.
목록인 경우 x = [1,2,3], 이제 x.remove(1)에 대해 연산을 수행하면 x 개체는 여전히 x 개체이지만 개체의 값이 변경되었습니다
첫 번째 코드 부분: 재할당입니다. 다른 범위에서는 nums가 다시 할당되므로 전역 변수 nums와 nums_chang 함수의 nums 변수는 더 이상 동일하지 않으므로 서로 다릅니다. 현재 nums_chang 함수의 nums 변수는 이미 로컬 변수이며 이 함수에서만 사용됩니다
두 번째 코드 조각: nums는 목록이자 변수 개체이므로 목록에 대한 작업은 이 개체에 영향을 주지 않으므로 이 개체는 여전히 전역 변수가 함수 내부와 외부 모두에서 사용됩니다. 수정하면 전역 변수의 값도 수정됩니다
먼저: 범위 문제에 관해 내 기사 중 하나를 먼저 참조할 수 있습니다. Python: Scope 및 LEGB, 먼저 비교할 수 있습니다.
变量
的查找有个基本的认识,然后我们能够看到, 因为有赋值语句
, 所以nums
로컬 범위에서만 검색하고 전역 도메인 문제와 상호 작용하지 않습니다.두 번째: 첫 번째를 바탕으로
nums.append(999)
中的nums
是从全局作用域
找到的, 又因为用的是append
方法, 这方法是直接用于源列表本身, 所以你看到全局的nums
또한 업데이트되었음을 알 수 있습니다함수가 자체 범위에서 변수를 찾을 수 없으면 이전 범위로 돌아가서 두 번째 범위를 찾습니다.
첫번째라면 가치를 부여한건 당연지사