Skip to main content

编程中常见错误的例子 (Part 2)

大家好,继续讲几个编程中常见的错误。

示例 1:循环中不正确的字符串拼接

  • 问题:代码在循环中使用 '+=' 进行字符串拼接。由于字符串在是不可变的,每次拼接都会创建一个新字符串, 导致性能低下,尤其是在处理大量数据时。
  • 正确方法:使用列表来收集字符串片段,最后使用 ''.join() 方法一次性拼接所有片段,这样效率更高。

示例 2:使用 '==' 而非 'isinstance' 进行类型检查

  • 问题:代码使用 'type(data) == str' 来检查类型,这种方法不够灵活,因为它不会考虑子类关系。 如果 'data' 是 'str' 的子类,这种检查会失败。
  • 正确方法:使用 'isinstance(data, str)' 来检查类型,它会考虑继承关系, 更符合 Python 的面向对象特性。

示例 3:变量遮蔽导致意外行为

  • 问题:代码中将变量命名为 'sum',这遮蔽了内置函数 'sum()'。 当尝试调用 'sum(numbers)' 时,会引发错误, 因为 'sum' 已经被重新定义为一个整数,而不是函数。这是一个常见的错误,尤其是在使用常见名称时。
  • 正确方法:避免使用内置函数或关键字作为变量名,使用更具描述性的名称, 如 'total' 或 'sum_of_numbers',以防止遮蔽内置名称。

示例 4:滥用列表推导式来执行副作用

  • 问题:代码使用列表推导式来执行打印操作,这是一种副作用。 列表推导式应该用于创建列表,而不是执行操作,这样做会使代码难以理解,并且生成的列表通常是无用的。
  • 正确方法:使用普通的 for 循环来执行副作用操作,保持代码的清晰性和意图明确。

示例 5:忘记在深拷贝中复制嵌套结构

  • 问题:代码使用 'copy.copy()' 进行浅拷贝,但对于嵌套结构(如列表中的列表), 浅拷贝只复制顶层对象,嵌套对象仍然是引用。这导致修改拷贝中的嵌套对象时会影响原始对象。
  • 正确方法:使用 'copy.deepcopy()' 来进行深拷贝,确保所有嵌套结构都被独立复制,避免意外修改原始数据。

代码示例

# Example 1: Incorrect string
# concatenation in loops
result = ""
for i in range(1000):
result += str(i) # Inefficient
# due to string immutability
print(result[:10] + "...")

# Example 2: Using '==' for
# type checking instead of
# 'isinstance'
data = "123"
if type(data) == str:
print("data is a string")
else:
print("data is not a string")

# Example 3: Variable
# shadowing leading to
# unexpected behavior
sum = 0
numbers = [1, 2, 3, 4, 5]
for num in numbers:
sum += num
print(sum(numbers)) # Error:
# 'sum' is not callable
# because it was redefined
# as an integer

# Example 4: Misusing list
# comprehension for side
# effects
numbers = [1, 2, 3, 4, 5]
[print(num) for num in numbers] #
# List comprehension used
# just for printing

# Example 5: Forgetting to
# copy nested structures
# in deep copies
import copy
original = [[1, 2, 3], [4, 5, 6]]
shallow_copy = copy.copy(original)
shallow_copy[0][0] = 99
print(original)
# Original is
# modified because nested
# lists are not copied