python列表里的切片和赋值

浅拷贝和深拷贝:

总结:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

附加:

当对象中存在指针成员时,除了在复制对象时需要考虑自定义拷贝构造函数,还应该考虑以下两种情形:

1.当函数的参数为对象时,实参传递给形参的实际上是实参的一个拷贝对象,系统自动通过拷贝构造函数实现;

2.当函数的返回值为一个对象时,该对象实际上是函数内对象的一个拷贝,用于返回函数调用处。

 

在python列表中:

  • 直接赋值是让同一个列表有了不同名字而已,所指向的内存空间是一样的,其中任意一个发生改变,另外一个也会跟着改变;

  • 而切片是开辟了一个新的空间存放了与原列表内容一样的值,它的内容不会因原列表的改变而改变。

L1 = ['a','b','c']
L2 = L1
L3 = L1[:]

print('L1=',L1)
print('L2=',L2)
print('L3=',L3)
L1= ['a', 'b', 'c']
L2= ['a', 'b', 'c']
L3= ['a', 'b', 'c']
L1.append('d')
print('L1=',L1)
print('L2=',L2)
print('L3=',L3)

//输出如下:

L1= ['a', 'b', 'c', 'd']
L2= ['a', 'b', 'c', 'd']
L3= ['a', 'b', 'c']


L3.append('e')
print('L1=',L1)
print('L2=',L2)
print('L3=',L3)

//输出如下:

L1= ['a', 'b', 'c', 'd']
L2= ['a', 'b', 'c', 'd']
L3= ['a', 'b', 'c', 'e']


L2.remove('a')
print('L1=',L1)
print('L2=',L2)
print('L3=',L3)

//输出如下:

L1= ['b', 'c', 'd']
L2= ['b', 'c', 'd']
L3= ['a', 'b', 'c', 'e']

牛客网上的一道题:

a=[1,2,3]
b=a
b[:] = [x+1 for x in a]
print (a, b)
b = [x-1 for x in a]
print (a, b)

//输出如下:

[2, 3, 4] [2, 3, 4]
[2, 3, 4] [1, 2, 3]

需要注意的是啊,就是啊,有只小黄故意捣乱,说为啥如下的代码,我对b=a值直接赋值之后,应该按照你上面说的 ''b和a指向同一个内存,任意一方改变时,另一方也会改变'' ,那为啥,我对b重新赋值之后,输出的a 没有变化。原因是:因为你对整个b变量全部重新赋值,其实此时是:把b指向了一个存放着[1,2,3,4]列表的内存的地方,a和b指向的内存已经不是一个内存了。

a=[1,2,3]
b=a
print (a, b)

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

//输出如下:

[1, 2, 3] [1, 2, 3]
[1, 2, 3] [1, 2, 3, 4]
  • 例题

python列表里的切片和赋值_第1张图片

python列表里的切片和赋值_第2张图片

你可能感兴趣的:(Python基本语法)