说到Python,大部分同学的第一印象就是“简单”。然而,Python中也有许多有趣和微妙的东西。如果不仔细了解它们,在开发过程中很容易陷入误区,长期无法自拔。下面,我将介绍Python中的一些有趣的东西。1.SubtleString>>>a="wtf">>>b="wtf">>>aisbTrue>>>a="wtf!">>>b=“卧槽!”>>>aisbFalse>>>a,b="wtf!","wtf!">>>aisbTrue是不是很神奇?为什么加!返回False,不加则返回True?为什么它在添加时返回True!并放置同一条线?这些行为是由于Cpython有时会尝试使用现有的不可变对象,而不是在编译和优化时每次都创建一个新对象。(这种行为称为字符串驻留[stringinterning])持久化发生后,很多变量可能指向内存中的同一个字符串对象。(从而节省内存)在上面的代码中,字符串是隐式持久化的。隐式持久化何时发生取决于具体的实现。以下是一些猜测字符串是否常驻的方法:所有长度为0和长度为1的字符串都是常驻的。字符串在编译时实现('wtf'会常驻,但''.join(['w','t','f'])不会常驻)当字符串只包含字母、数字或下划线时,它将常驻。所以'卧槽!将驻留,因为它包含!不是居民。当设置a和b的值为“wtf!”时在同一行,Python解释器创建一个新对象,然后同时引用第二个变量。如果您在不同的线路上进行分配,它不会“知道”已经有一个wtf!对象(因为“wtf!”不是如上所述的隐式驻留)。它是一种编译器优化,特别适用于交互式环境。2、is和的区别==>>>a=256>>>b=256>>>aisbTrue>>>a=257>>>b=257>>>aisbFalse>>>a=257;b=257>>>aisbTrueisoperator检查两个操作数是否引用同一个对象(即检查两个操作数是否相同)。==运算符比较两个操作数的值是否相等。so是表示引用相同,==表示值相等。下面的例子可以很好地说明这一点,>>>[]==[]True>>>[]is[]#这两个空列表位于不同的内存地址。False256是一个已经存在的对象,而257不是。当你启动Python时,已经分配了值从-5到256的对象。这些数字是预先准备好的,因为它们经常被使用。Python通过这种方式创建一个小整数池来避免小整数对内存空间的频繁申请和破坏。3.isnot...notis(not...)>>>'something'isnotNoneTrue>>>'something'is(notNone)False不是单独的二元运算符,区别于使用isand不分开。如果运算符两边的变量指向同一个对象,则isnot的结果为False,否则结果为True。4.逗号>>>deff(x,y,):...print(x,y)...>>>defg(x=4,y=5,):...print(x,y)...>>>defh(x,**kwargs,):文件"
