python赋值/拷贝问题

在使用Python进行排序算法测试时,遇到pytest失败的问题,根源在于列表赋值导致的引用错误。文章探讨了Python中的赋值和拷贝概念,指出简单赋值会导致多个变量指向同一内存地址。通过创建浅拷贝可以解决这个问题,但当列表包含可变对象时,浅拷贝仍可能导致意外修改。深拷贝则能完全避免这种问题。文章提供了问题解决方案,并建议理解Python的拷贝机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码见最后。

在学习排序算法时,本想写个pytest比较一下时间,结果发现结果老是failed。仔细想了下之前看过类似文章提到过赋值时特别注意,于是检查了代码,发现是生成数组的函数有问题,因为我使用的scope=module,于是create_list这个函数返回的值在整个test_sorts.py的测试中是同一个,如果冒泡简单的赋值给另外一个列表,那么我引用的时候实际上还是会影响原始的列表,原始的列表实际和赋值的列表在内存中是同一个。

最简单的解决办法是把scope=module换为function范围,这样每个test_函数都会重新调用create_list生成列表,但是强迫症的我想用同一个数组测。

于是查看了关于python拷贝,通过copy浅拷贝可以实现修改的列表和原始列表不同,这样便可以区别开。

但是,如果你的浅拷贝的列表里面设计了其他的可变对象,在修改这个对象的时候两个列表是指向的同一个,修改会反映到两个列表中,深拷贝没有这个问题。

详细参考这篇博客

测试执行:

pytest -v -s test_sorts.py  # 详细/标准打印模式
#!/usr/bin/python
# coding: utf-8
from algorithm.sort.basicSort import *
import pytest
from random import randint
import time
from functools import wraps


def run_timer(f):
    @wraps(f)
    def function_timer(*args, **kwargs):
        ts = time.time()
        result = f(*args, **kwargs)
        te = time.time()
        print("\nTotal time running {0}: {1} seconds".format(f.__name__, str(te - ts)))
        return result

    return function_timer


@pytest.fixture(scope="module", params=[100, 1000, 10000])
def create_list(request):
    nums = []
    for i in range(request.param):
        nums.append(randint(0, request.param))
    return nums


@run_timer
def test_bubble_sort(create_list):
    origin_list = create_list.copy()
    sort_list = bubble_sort(origin_list)
    # print(sort_list, create_list, origin_list)
    assert sort_list != create_list


@run_timer
def test_insert_sort(create_list):
    origin_list = create_list.copy()
    sort_list = insert_sort(origin_list)
    # print(sort_list, create_list)
    assert sort_list != create_list
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值