>  기사  >  백엔드 개발  >  Python 인터뷰 자주 묻는 질문: 가변 데이터 유형과 불변 데이터 유형의 차이점

Python 인터뷰 자주 묻는 질문: 가변 데이터 유형과 불변 데이터 유형의 차이점

WBOY
WBOY앞으로
2023-05-19 16:04:061195검색

Python 面试高频问题:可变数据类型和不可变数据类型的区别

Python 가변 데이터 유형과 불변 데이터 유형은 기본적이고 중요한 테스트 포인트입니다. 간단히 말하면, 여기의 변수는 가변적이고 불변이며, 변수가 변경될 때 데이터의 주소가 변경되는지 여부를 참조합니다!

변수 데이터 유형: 변수의 값이 변경되면 새 개체를 만드는 것과 같습니다(즉, 주소가 변경됩니다).

변수 데이터 유형: 변수의 값은 변경되지만 개체의 주소는 변경되지 않습니다.

불변 데이터 유형: 튜플, 문자열, 숫자 값.

가변 데이터 유형: 사전, 목록, 집합.

References

변경 가능한 데이터 유형과 불변 데이터 유형에 대해 이야기하기 전에 참조의 개념에 대해 이야기해야 합니다. Python 변수는 힙 메모리의 개체를 가리키는 개체에 대한 참조를 저장합니다. 힙에 할당된 개체는 두 가지 범주로 나누어집니다. 하나는 변경 가능한 개체이고 다른 하나는 변경 불가능한 개체입니다. 예: s1="abc".

사실 변수 s1은 abc 객체에 대한 참조입니다. s1은 abc가 저장된 메모리 주소를 가리킵니다. s1의 주소 값을 보려면 주소를 변환하는 함수 id를 사용할 수 있습니다. 값을 십진수로 표시합니다. 아래 그림과 같이 print(id(s1))를 사용하세요.

Python 面试高频问题:可变数据类型和不可变数据类型的区别

불변 데이터 유형

문자열을 예로 들어 코드로 바로 이동합니다.

s1="abc"
print(id(s1))
s1="xyz"
print(id(s1))

출력:

140712532603136
140712532603168

You 출력 결과의 변화를 확인할 수 있습니다. 문자열형 변수의 값과 주소도 이에 따라 변경됩니다.

다음에는 서면 인터뷰에서 자주 묻는 질문이기도 한 이 예를 살펴보겠습니다.

#위 코드를 기반으로 다음 코드를 작성합니다.

s2=s1
print(id(s1))
print(id(s2))

출력:

743316570224
743316570224

s2=s1이 실제로 s2와 s1 모두 동일한 주소를 가리키는 것을 볼 수 있습니다.

계속해서 s2의 값을 변경해 보겠습니다.

s2="def"
print(id(s1))
print(s1)
print(id(s2))
print(s2)

출력:

879864758384
xyz
879889887984
def

이를 보면 s2 값을 변경해도 s1 값에 영향을 주지 않는 이유를 이해할 수 있습니다. s1과 s2는 서로 다른 주소를 가리키기 때문에 s1의 값은 변경되지 않았습니다!

가변 데이터 유형

목록을 예로 들어보겠습니다.

l = [1, 2, 3]
print(id(l))
l.remove(1) # 删除元素
print(id(l))
l.append(4) # 增加元素
print(id(l))
l[1] = '8' # 修改元素
print(id(l))

출력:

405927907912
405927907912
405927907912
405927907912

목록이 추가, 삭제, 수정되는 것을 볼 수 있습니다. 목록의 주소는 변경되지 않지만 값은 변경됩니다. 변수가 변경되고 새 변수가 생성되지 않는 경우 변수가 참조하는 개체의 주소는 변경되지 않습니다.

앞의 문자열 할당 예시와 비슷한 다음 예시를 다시 살펴보세요.

l1=['a','b','c']
l2=l1
print(id(l1))
print(id(l2))
l2.append('d')
print("************")
print(id(l1))
print(l1)
print(id(l2))
print(l2)

출력:

838366483528
838366483528
************
838366483528
['a', 'b', 'c', 'd']
838366483528
['a', 'b', 'c', 'd']

출력 결과는 여기서 설명하지 않습니다. l1과 l2의 주소가 동일하므로 서로 영향을 미치기 때문입니다.

목록 복사

목록을 문자열처럼 복사하여 값은 같지만 주소가 다른 두 개의 목록을 생성하려면 어떻게 해야 합니까? 사실 이 문제의 본질은 리스트의 직접 할당(직접 할당에 사용)과 복사(복사는 얕은 복사와 깊은 복사로 나누어짐)의 차이에 있습니다. 얕은 복사에 대한 관련 지식을 소개하기 위해 다른 글을 작성하겠습니다. 그리고 딥카피에 계속해서 관심을 가져주세요.

여기서는 먼저 list() 생성자를 사용하여 비교적 간단한 복사 방법을 소개합니다. 코드는 다음과 같습니다.

l3=['x','y','z']
l4=list(l3)
print(id(l3))
print(id(l4))
l4.append('a')
print(l3)
print(l4)

출력:

831456302152
831480344136
['x', 'y', 'z']
['x', 'y', 'z', 'a']

결과에서 볼 수 있듯이 l3과 l4의 주소가 다릅니다. , 서로 영향을 미치지 않습니다. 인덱스, 목록 생성, copy() 등을 사용하여 두 목록이 서로 다른 목록 객체를 가리키도록 만들 수도 있는데, 여기서는 하나씩 소개하지 않겠습니다!

위 내용은 Python 인터뷰 자주 묻는 질문: 가변 데이터 유형과 불변 데이터 유형의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제