你已经开始熟悉Python了。你可以对字符串进行切片和处理,使用.format(),甚至可能还会用f-string。但是你是否曾经停下来思考过,当你写下name = "Alice"时,底层到底发生了什么?
了解一些关于内存的知识会让你成为更好的程序员。它可以帮助你解释一些"奇怪"的行为,并让你更加批判性地思考你的代码。让我们一起来深入了解。
这是最重要的概念。初学者常见的思维模型是把变量想象成放置数据的盒子。
一个更准确的模型是把变量看作是标签或名牌,你把它贴在一块数据上。
为什么这很重要?因为这意味着my_name和also_my_name都指向计算机内存中_完全相同_的字符串。这很高效!除非你明确要求,否则Python不会浪费内存来创建两个相同的副本。
这直接引出了一个经典的初级面试问题:is和==有什么区别?
那么为什么a is b也是True呢?这就引出了我们的下一个概念。
为了节省内存,Python会自动驻留(intern)小的、常见的字符串(和整数)。这意味着它在内存中只创建一个副本,并让所有变量都指向这个单一副本。
字符串"hello"很短且常见。当你写b = "hello"时,Python足够聪明,会找到内存中已存在的"hello"并让b指向它。这就是为什么a is b是True。
字符串c是通过切片更大的字符串动态创建的("hello world!"[:5])。虽然它的值是"hello",但Python的驻留行为在这里不太一致,所以它通常会成为内存中一个新的、独立的对象。因此,a is c是False。
⚠️ 初级开发者要点: 始终使用==来检查字符串值。驻留是Python用于提高效率的内存优化,但它不是你应该依赖的程序逻辑规则。只有当你特别需要检查是否是内存中的同一个对象时才使用is(这种情况很少见)。
Python中的字符串是不可变的。这是一个专业术语,意思是"不能被改变"。
这与内存有关,因为它是安全的。由于字符串不能改变,Python可以自由地共享它们(通过驻留),而不用担心改变一个变量会意外地改变另一个。
思考内存不仅仅是高级工程师的事。这是编写高效、无bug代码的第一步。记住这些概念,你就已经在像专业人士一样思考了!