【python】Leetcode记录--02/09/2020

283. Move Zeroes [Easy]

题目:link

range和xrange的区别

两个函数接收的参数完全一样,三个参数:start, end, step
不同的是range返回的是个列表list,xrange返回的类型是’xrange’,一个生成器,每次调用都会返回其中的一个值。由此可见,如果是在做循环的情况下,要生成很大的数字列表,用xrange性能会比range要好很多,因为不需要用那么多的内存空间。但是如果需要的就是一个list,那就range。
如果xrange要显示出来需要list(xrange(8))才会返回一个list,不然xrange(8)还是返回xrange(8)

然鹅,在python3中xrange和range已经合并为range了= =!
准备一顿操作猛如虎结果马上报错name ‘xrange’ is not defined
把xrange改成range就好

赋值,浅拷贝(shallow copy),深拷贝(deep copy)

本来只是想探讨一下nums[:]这一操作会不会需要更多内存= =

1.赋值

在python中,对象的赋值就是简单的对象引用
a = b是直接赋值,这样实际上是把b的地址赋给了a,不会开辟新的内存空间,所以如果a.sort(),b也会被sort,a和b是会互相影响的关系。
所以a = b这个操作,除了多了一个b变量名外,不会有其他内存开销

2.浅拷贝

浅拷贝意味着构造一个新的集合对象,然后用在原始集合中找到的子对象的引用填充它。 复制过程不会递归,因此不会自己创建子对象的副本。 在浅拷贝的情况下,对象的引用被复制到其他对象中。
开辟了新内存,也不是同一个对象,个人觉得关键在于子对象,如果在后面简单的加元素不会影响到原来的元素,但是如果涉及到子对象,因为子对象是引用的形式,所以相互之间就会影响。

eg:[1, 2, 3]浅拷贝即深拷贝,互不影响
eg:[1, 2, 3, [2, 3]]在不涉及到子对象[2, 3]的情况下,互不影响,或者说只要把[2, 3]视为一个整体还是互不影响,比如说:.pop(3)是不会影响对方的,只有点名道姓的要改[2, 3]了才会互相影响,而且是同步的。

三种浅拷贝:

  • 切片:a = b[:] or a = [… for … in b]
  • 工厂函数:a = list(a)
  • copy函数:copy.copy(a)

这里有个很有意思的地方:

nums=[1,2,3,3,3,4]
for i in nums:
    if i ==3:
        nums.remove(i)
print(len(nums))

结果是4,因为删掉了第一个序号是2的3后,第二个3的序号变成2,然而这个时候循环会循环到序号为3的第三个3上面,跳过第二个3

nums=[1,2,3,3,3,4]
for i in nums[:]:
    if i ==3:
        nums.remove(i)
print(len(nums))

结果为3,因为遍历的是另一个list(切片

所以我最开始纠结的地方:这一个语句会不会造成更多的内存空间?肯定会啊,虽然可能只是中间短暂的创造了

nums[:] = [ x for x in nums if x != 0] + ([0] *  nums.count(0))
深拷贝

深度拷贝是一个递归地执行复制过程的过程。 这意味着首先构造一个新的集合对象,然后递归地用在原始集合中找到的子对象的副本填充它。 如果是深度拷贝,则在其他对象中复制对象的副本。 这意味着对对象副本所做的任何更改都不会反映在原始对象中。

使用“ deepcopy ()”函数实现

浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)有关: 浅复制构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中。 深度拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。

其他

    1. Symmetric Tree
    1. Single Number
    1. Majority Element
    1. Palindrome Linked List link
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值