iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python3--中一些常见的坑(机制上的问题)
  • 467
分享到

python3--中一些常见的坑(机制上的问题)

机制常见 2023-01-30 21:01:43 467人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

python中is,==,id 的意思== :数值的比较is :内存地址的比较id :查看内存地址list(列表)中存在的一些坑重点:在循环一个列表时,最好不要进行删除的动作(一旦删除,索引会随之改变),容易错误。将下面列表中索引为奇数的元

python

is,==,id 的意思

== :数值的比较

is :内存地址的比较

id :查看内存地址


list(列表)中存在的一些坑

重点:在循环一个列表时,最好不要进行删除的动作(一旦删除,索引会随之改变),容易错误。


将下面列表中索引为奇数的元素删除

li = ['Python', 'PHP', 'java', 'iOS', 'c++', 'C', 'Go']

错误的方法

li = ['python', 'php', 'java', 'ios', 'C++', 'C', 'Go']
for i in li:
    s = li.index(i)
    if s % 2 == 1:
        li.pop(s)
print(li)

执行结果

['python', 'java', 'ios', 'C', 'Go']

很明显,这结果跟我们想的不一样

正确的方法:

1.利用切片的方式

del li[1::2]
print(li)

执行结果为

['python', 'java', 'C++', 'Go']

2.将偶数添加到新列表,最后将原始列表覆盖

li_new =[]
for i in li:
    if li.index(i) % 2 == 0:
        li_new.append(i)
li = li_new
print(li)

执行结果

['python', 'java', 'C++', 'Go']

3.如果想要在循环列表的时候,删除呢?

倒着删除就可以了

for i in range(len(li)-1, -1, -2):
    print(li[i])

执行结果

Go

C++

java

python

倒着删除不影响前面列表的索引顺序

这个答案才是正确的,因为每次列表删除后,原列表的索引值都会改变,导致结果不一样


dict(字典)中一些错误的使用方法

重要:在循环列表或者字典的时候,千万不要做添加或者删除操作

dic = dict.fromkeys('abc', 'sam') # 'abc'为一个可迭代对象
print(dic)

执行结果

{'c': 'sam', 'a': 'sam', 'b': 'sam'}


这里有个坑

dic = dict.fromkeys([1, 2, 3], [])
print(dic)

执行结果

{1: [], 2: [], 3: []}

给上面的空列表添加一元素

dic[1].append('你好')

print(dic)

执行结果

{1: ['你好'], 2: ['你好'], 3: ['你好']}

上面,dic里面的3个列表,在内存中对应的是同一个列表,所以里面的内容相同


例2

dic = {'k1':'value1','k2':'value2','name':'sam'}

将dic字典中含有k元素的键,对应的键值对删除

错误的方法

for i in dic.keys():
    if 'k' in i:
        del dic[i]
print(dic)

执行报错

RuntimeError: dictionary changed size during iteration

意思就是,在循环字典过程中,不允许改变字典

不能删除,那么尝试一下能否添加吧

count = 0

for i in dic:

    dic[i + str(count)] = dic[i]

    count += 1

上面代码,第一次添加k10,第二次添加k21

执行代码也报错

RuntimeError: dictionary changed size during iteration

那么如果一定要添加,怎么做?

先将含有k的键值对,添加到列表,然后循环列表,删除字典的key

s = []
for i in dic:
    if 'k' in i:
        s.append(i)
for x in s:
    del dic[x]
print(dic)

执行结果

{'name': 'sam'}


set集合

数据类型:

不重复,无序,它里面的元素是可哈希的,他本是不可哈希的,他不能作为字典的key

去重有2种方法。1,用集合,2.用算法

set的作用:

1,去重

2,数据关系的测试

例子

li = [11, 11, 22, 22, 33, 33, 33, 44]
li = list(set(li))
print(li)

执行结果为

[33, 11, 44, 22]

列表的去重,直接转换为集合,就可以了

set集合的用法

add 增

s1 = set()
s1.add('sam')
print(s1, type(s1))

执行结果

{'sam'}


update迭代增加

s1 = set()
s1.add('sam')
s1.update('abc')
print(s1)


2.set 删

set1 = {'sam', 'tom', 'zhangsan', 'lisi', 'wangwu'}
set1.remove('sam') #删除一个指定元素
print(set1)
set1.pop()  #随机删除一个元素
print(set1)
set1.clear() #清空集合
print(set1)
del set1    #删除集合

pop随机删除方法有返回值

set()表示一个空集合

集合没有改的方法,查只能for循环

for i in set1:

    print(i)

执行结果

tom

sam

lisi

zhangsan

wangwu


set关系测试

交集& ,intersection

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(set1 & set2)
print(set1.intersection(set2))

执行输出

{4, 5}

{4, 5}


并集 |,uNIOn

print(set1 | set2)

print(set1.union(set2))

执行输出

{1, 2, 3, 4, 5, 6, 7, 8}

{1, 2, 3, 4, 5, 6, 7, 8}


反交集 ^  symmetric_difference

print(set1 ^ set2)

print(set1.symmetric_difference(set2))

执行输出

{1, 2, 3, 6, 7, 8}

{1, 2, 3, 6, 7, 8}


差集

print(set1 - set2)

执行输出

{1, 2, 3}


子集 issubset

例子

set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5, 6}
print(set1.issubset(set2))

执行结果

True


超集

print(set2.issuperset(set1)) #set2是set1的超集

执行结果

True


将集合转换为可哈希的类型,可以作为字典的key

set1 = {'barry', 'tom'}
set2 = frozenset(set1)
print(set2)

执行结果为

frozenset({'tom', 'barry'})


深浅copy

l1 = [1, 2, 3]
l2 = l1
l2.append(111)
print(l1, l2)

执行结果,结果是一样的

[1, 2, 3, 111] [1, 2, 3, 111]

对于赋值运算,指向的是同一个内存地址,字典,列表,集合都一样


copy不是指向同一个,在内存中开辟了一个内存空间

l1 = [1, 2, 3]
l2 = l1.copy()
l1.append(111)
print(l1, l2)
print(id(l1), id(l2)) #打印出内存地址

执行结果

[1, 2, 3, 111] [1, 2, 3]

2230811766152 2230811765256

例子2

l1 = [1, 2, [1, 2, 3], 4]
l2 = l1.copy()
l1[2].append(666)
print(l1)
print(l2)

执行结果

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

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

重点:对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址


深copy,需要导入一个模块copy

import copy
l1 = [1, 2, [1, 2, 3], 4]
l2 = copy.deepcopy(l1)
l1[2].append(666)
print(l1)
print(l2)

执行结果

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

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

重点:

深copy,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不会改变

浅copy,第一层是新的,从第二次开始,共用一个


python开发面试题

下面的例子,l2是深copy还是浅copy

l1 = [1, 2, 3, [22, 33]]
l2 = l1[:]
l1[3].append(666)
print(l2)

对于切片来说,它是执行了浅copy

总结,切片就是浅copy


编码补充

python内部编码,使用unicode

s = 'sam'

s1 = s.encode('utf-8') # unicode ---> utf-8

s2 = s.encode('gbk') # unicode ---> gbk

utf-8转换成unicode

s3 = s1.decode('utf-8')

print(s3)

sam

blob.png


重点:utf-8和gbk不能直接互相转化,必须通过unicode才可以

例子

s = '你好'
s1 = s.encode('gbk') #unicode转化为gbk
s2 = s1.decode('gbk') #gbk转化为unicode
s2.encode('utf-8') #unicode转化为utf-8
print(s2)

执行为

你好

--结束END--

本文标题: python3--中一些常见的坑(机制上的问题)

本文链接: https://www.lsjlt.com/news/179025.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python3--中一些常见的坑(机制上的问题)
    python中is,==,id 的意思== :数值的比较is :内存地址的比较id :查看内存地址list(列表)中存在的一些坑重点:在循环一个列表时,最好不要进行删除的动作(一旦删除,索引会随之改变),容易错误。将下面列表中索引为奇数的元...
    99+
    2023-01-30
    机制 常见
  • GitHub 安装的一些常见问题
    GitHub 是一个世界上最大的开源代码托管平台之一,它允许用户存储和共享代码,构建软件项目和协作开发。然而,有些用户可能会遇到一些问题,如安装 GitHub 时出现错误。在本文中,将讨论 GitHub 安装的一些常见问题,并提供解决方案。...
    99+
    2023-10-22
  • go中make用法及常见的一些坑
    目录make用法和参数用法使用make常见的一些坑1:slice使用make2:map使用map:总结make用法和参数用法 golang分配内存有一个make函数,该函数第一个数类...
    99+
    2022-12-26
    go语言make go语言make
  • LeetCode上最常见的Java问题有哪些?
    LeetCode是一款非常受欢迎的算法题库,涵盖了各种难度级别的问题。作为一名Java开发者,我们也经常会在LeetCode中遇到各种各样的问题。在这篇文章中,我们将探讨LeetCode上最常见的Java问题有哪些,并提供相应的解决方案。 ...
    99+
    2023-07-29
    leetcode npm 文件
  • Java中常见的坑有哪些
    今天小编给大家分享一下Java中常见的坑有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前言同一个代码“坑”,踩第一...
    99+
    2023-06-27
  • Mybatis-plus常见的坑@TableField不生效问题
    目录Mybatis-plus的坑@TableField不生效事件回归@TableField失效的几种情况总结 总结后记Mybatis-plus的坑@TableField不生...
    99+
    2024-04-02
  • C++构造函数一些常见的坑
    文章转自微信 公众号:Coder梁(ID:Coder_LT) 某一天我们接到了一个需求,需要开发一个类似于STL中string的类。 我们很快写好了代码: #include <...
    99+
    2024-04-02
  • Redis中一些最常见的面试问题总结
    前言 经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估计是我...
    99+
    2024-04-02
  • Linux中有哪些常见的问题
    这篇文章主要介绍了Linux中有哪些常见的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、 文档文档及其不足是今年最大的痛点之一。尽管开源的方式产生了优秀的代码,但是制...
    99+
    2023-06-10
  • 虚拟主机常见的问题有哪些
    虚拟主机常见的问题有:1、怎么设置只许内部人员访问,别人无法访问;2、虚拟主机开通了但用不了怎么解决;3、绑定了域名还是无法访问怎么办;4、ACCESS数据库被别人下载怎么办;5、FTP上传出现中断四什么原因导致的;6、日志文件需要定期清除...
    99+
    2024-04-02
  • Java中ReentrantLock常见的坑有哪些
    这篇文章主要介绍“Java中ReentrantLock常见的坑有哪些”,在日常操作中,相信很多人在Java中ReentrantLock常见的坑有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Re...
    99+
    2023-06-30
  • Java面试题中常见的问题有哪些
    本篇内容主要讲解“Java面试题中常见的问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java面试题中常见的问题有哪些”吧!  1、java 中会存在内存泄漏吗,请简单描述。  答:会...
    99+
    2023-06-02
  • MySQL的常见问题有哪些
    这篇文章主要介绍“MySQL的常见问题有哪些”,在日常操作中,相信很多人在MySQL的常见问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL的常见问题有哪些”...
    99+
    2024-04-02
  • MyCAT的常见问题有哪些
    小编给大家分享一下MyCAT的常见问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 一:连...
    99+
    2024-04-02
  • c#常见的问题有哪些
    今天小编给大家分享一下c#常见的问题有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 ...
    99+
    2024-04-02
  • Tunnel的常见问题有哪些
    这篇文章主要介绍“Tunnel的常见问题有哪些”,在日常操作中,相信很多人在Tunnel的常见问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Tunnel的常见问题有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-02
  • MySQL中常见的日志问题有哪些
    小编给大家分享一下MySQL中常见的日志问题有哪些,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!MySQL 里有两个日志,即:重做日志(redo log)和归档日志(binlog)。其中,bi...
    99+
    2024-04-02
  • Java编程中常见的问题有哪些
    本篇内容介绍了“Java编程中常见的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!字符串连接误用错误的写法:String ...
    99+
    2023-06-17
  • PHP中有哪些常见的错误机制
    今天就跟大家聊聊有关PHP中有哪些常见的错误机制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。PHP的错误级别首先需要了解php有哪些错误。截至到php5.5,一共有16个错误级别注...
    99+
    2023-06-17
  • Linux中常见的故障问题有哪些
    小编给大家分享一下Linux中常见的故障问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作