alva_space 2024-07-24 12:16 采纳率: 100%
浏览 4
已结题

python函数调用


def confirm_users(confirmed_user,unconfirmed_user):
   """这个函数用于将未确认用户的名单列表
   移动到已确认(审核)的用户的名单列表
"""
    while unconfirmed_user:
        user=unconfirmed_user.pop(0)
        user=user.title()
        confirmed_user.append(user)
        print(confirmed_user)                     

def print_users(confirmed_user):
"""这个函数用于将已通过审核的名单列表逐一打印出来"""
    for user in confirmed_user:
        print(user)

confirmed_user = []
unconfirmed_user = ['alva','richard','steeve','ula']    
                                                                                         #新建两个列表,已确认用户为空
confirm_users(confirmed_user,unconfirmed_user)           #调用两个函数
print_users(confirmed_user)
print(confirmed_user)                                                      #打印出函数

以下是vscode终端运行结果:
['Alva']
['Alva', 'Richard']
['Alva', 'Richard', 'Steeve']
['Alva', 'Richard', 'Steeve', 'Ula']
Alva
Richard
Steeve
Ula
['Alva', 'Richard', 'Steeve', 'Ula']

问题:想问一下各位,就是在第一次调用的时候我把两个列表传给了第一个函数,但是调用第二个函数并且传输confirmed_user的时候,为什么这里传进去的列表实参不是我原本定义的那个空列表?但是根据结果,好像第一次函数调用就修改了这个confirmed_user列表的值,然后在调用第二次函数时,传进去的也是修改后的这个列表。这里我就不是很懂了,为什么这个例子里面调用函数修改了我原本定义的空列表啊?

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-24 12:17
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    你的理解是正确的。在Python中,列表是可变对象,当你将一个列表作为参数传递给函数时,实际上是传递了这个列表的引用。这意味着函数内部对列表所做的任何修改都会反映到原始列表上。

    在你的代码中,confirm_users 函数接收了两个列表作为参数:confirmed_userunconfirmed_user。在函数内部,通过 pop(0) 方法从 unconfirmed_user 中移除元素,并将其添加到 confirmed_user 中。由于列表是按引用传递的,所以 confirmed_user 的变化会反映到原始列表上。

    这里是你的代码的逐行分析:

    1. 定义了 confirm_users 函数,该函数接受两个参数:confirmed_userunconfirmed_user
    2. 使用 while 循环,从 unconfirmed_user 中取出第一个元素,将其转换为标题格式,然后添加到 confirmed_user 中。
    3. 在每次循环中,打印当前的 confirmed_user 列表。
    4. 定义了 print_users 函数,该函数接受一个参数:confirmed_user,并打印列表中的每个元素。
    5. 初始化了两个列表:confirmed_user 为空列表,unconfirmed_user 包含四个待确认的用户名。
    6. 调用 confirm_users 函数,并传入这两个列表。在函数内部,confirmed_user 被修改。
    7. 调用 print_users 函数,并传入修改后的 confirmed_user 列表。由于列表是按引用传递的,所以这里打印的是修改后的列表。
    8. 打印最终的 confirmed_user 列表,显示所有已确认的用户。

    如果你想要在函数调用后保持 confirmed_user 列表的原始状态不变,你可以在函数内部使用列表的副本来操作,而不是直接修改原始列表。下面是修改后的代码示例:

    def confirm_users(confirmed_user, unconfirmed_user):
        confirmed_user_copy = confirmed_user[:]  # 创建confirmed_user的副本
        while unconfirmed_user:
            user = unconfirmed_user.pop(0)
            user = user.title()
            confirmed_user_copy.append(user)
            print(confirmed_user_copy)
    
    def print_users(confirmed_user):
        for user in confirmed_user:
            print(user)
    
    confirmed_user = []
    unconfirmed_user = ['alva', 'richard', 'steeve', 'ula']
    confirm_users(confirmed_user, unconfirmed_user)  # 调用函数,但不修改原始confirmed_user
    print_users(confirmed_user)  # 打印原始confirmed_user,此时应为空
    print(confirmed_user)  # 再次打印,确认confirmed_user未被修改
    

    在这个修改后的版本中,confirm_users 函数现在使用 confirmed_user[:] 来创建 confirmed_user 的副本,这样原始的 confirmed_user 就不会被修改。调用 confirm_users 函数后,print_users 函数和最后的打印语句将显示原始未修改的 confirmed_user 列表。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 7月24日