前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python这五个坑,怎么避开?

Python这五个坑,怎么避开?

作者头像
double
发布2020-02-12 16:09:40
3250
发布2020-02-12 16:09:40
举报
文章被收录于专栏:算法channel算法channel

今天,跟大家探讨几个Python比较常见的坑点,希望对大家有所帮助。文末点击阅读原文,了解更多坑点。

1 含单个元素的元组

Python中有些函数的参数类型为元组,其内有1个元素,这样创建是错误的:

代码语言:javascript
复制
c = (5) # NO!

它实际创建一个整型元素5,必须要在元素后加一个逗号:

代码语言:javascript
复制
c = (5,) # YES!

2 默认参数设为空

含有默认参数的函数,如果类型为容器,且设置为空:

代码语言:javascript
复制
def f(a,b=[]):  # NO!
    print(b)
    return b

ret = f(1)
ret.append(1)
ret.append(2)
# 当再调用f(1)时,预计打印为 []
f(1)
# 但是却为 [1,2]

这是可变类型的默认参数之坑,请务必设置此类默认参数为None:

代码语言:javascript
复制
def f(a,b=None): # YES!
    pass

3 共享变量未绑定之坑

有时想要多个函数共享一个全局变量,但却在某个函数内试图修改它为局部变量:

代码语言:javascript
复制
i = 1
def f():
    i+=1 #NO!
    
def g():
    print(i)

应该在f函数内显示声明i为global变量:

代码语言:javascript
复制
i = 1
def f():
    global i # YES!
    i+=1

4 列表快速复制之坑

在python中*与列表操作,实现快速元素复制:

代码语言:javascript
复制
a = [1,3,5] * 3 # [1,3,5,1,3,5,1,3,5]
a[0] = 10 # [10, 2, 3, 1, 2, 3, 1, 2, 3]

如果列表元素为列表或字典等复合类型:

代码语言:javascript
复制
a = [[1,3,5],[2,4]] * 3 # [[1, 3, 5], [2, 4], [1, 3, 5], [2, 4], [1, 3, 5], [2, 4]]

a[0][0] = 10 #

结果可能出乎你的意料,其他a[1[0]等也被修改为10

代码语言:javascript
复制
[[10, 3, 5], [2, 4], [10, 3, 5], [2, 4], [10, 3, 5], [2, 4]]

这是因为*复制的复合对象都是浅引用,也就是说id(a[0])与id(a[2])门牌号是相等的。如果想要实现深复制效果,这么做:

代码语言:javascript
复制
a = [[] for _ in range(3)]

5 列表删除之坑

删除一个列表中的元素,此元素可能在列表中重复多次:

代码语言:javascript
复制
def del_item(lst,e):
    return [lst.remove(i) for i in e if i==e] # NO!

考虑删除这个序列[1,3,3,3,5]中的元素3,结果发现只删除其中两个:

代码语言:javascript
复制
del_item([1,3,3,3,5],3) # 结果:[1,3,5]

正确做法:

代码语言:javascript
复制
def del_item(lst,e):
    d = dict(zip(range(len(lst)),lst)) # YES! 构造字典
    return [v for k,v in d.items() if v!=e]

以上就是5个常见的坑点,希望看到这里的朋友能避开这些坑。

点击 阅读原文,了解更多坑点~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 含单个元素的元组
  • 2 默认参数设为空
  • 3 共享变量未绑定之坑
  • 4 列表快速复制之坑
  • 5 列表删除之坑
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档