当前位置: 首页 > news >正文

Python常见面试题的详解3

1. 类和对象的区别、对象访问类的方法、创建对象时的操作

  • 类和对象的区别:类是一种抽象的概念,它定义了一组具有相同属性和方法的对象的蓝图或模板。而对象是类的具体实例,是根据类创建出来的实体,每个对象都有自己独立的状态(属性值)。
  • 对象访问类的方法:对象可以通过点号(.)来访问类中定义的方法。
  • 创建对象时的操作:当创建一个对象时,Python 会为对象分配内存空间,然后调用类的 __init__ 方法(如果存在)来初始化对象的属性。

python

class MyClass:
    def __init__(self, value):
        self.value = value

    def print_value(self):
        print(self.value)

# 创建对象
obj = MyClass(10)
# 对象访问类的方法
obj.print_value()

2. 分组一个 list 里面的元素

python

def group_list(lst, group_size):
    return [lst[i:i+group_size] for i in range(0, len(lst), group_size)]

lst = list(range(1, 101))
result = group_list(lst, 3)
print(result)

3. 删除一个 list 里面的重复元素

python

lst = [1, 2, 2, 3, 4, 4, 5]
unique_lst = list(set(lst))
print(unique_lst)

4. 遍历目录与子目录,抓取.pyc 文件

python

import os

def find_pyc_files(root_dir):
    pyc_files = []
    for root, dirs, files in os.walk(root_dir):
        for file in files:
            if file.endswith('.pyc'):
                pyc_files.append(os.path.join(root, file))
    return pyc_files

root_directory = '.'  # 当前目录
pyc_files = find_pyc_files(root_directory)
print(pyc_files)

5. 生成含有 n 个元素值为 1~n 的数组,元素顺序随机,但值不重复

python

import random

def generate_random_array(n):
    arr = list(range(1, n + 1))
    random.shuffle(arr)
    return arr

n = 10
random_arr = generate_random_array(n)
print(random_arr)

6. 在不用其他变量的情况下,交换 a、b 变量的值

python

a = 5
b = 10
a, b = b, a
print(f"a = {a}, b = {b}")

7. 在一个 function 里设置一个全局变量

python

global_var = 0

def set_global_variable():
    global global_var
    global_var = 10

set_global_variable()
print(global_var)

8.写出下面代码的运行结果

python

def extendList(val, list=[]):

    list.append(val)

    return list

list1 = extendList(11)

list2 = extendList(111, ['a','b','c'])

list3 = extendList('a')

print "list1 = %s" % list1

print "list2 = %s" % list2

print "list3 = %s" % list3

以下代码的输出结果为:

python

list1 = [11, 'a']
list2 = ['a', 'b', 'c', 111]
list3 = [11, 'a']

关键分析:

  1. 默认参数的陷阱
    Python 中函数的默认参数(如 list=[])在函数定义时仅初始化一次,而非每次调用都新建。因此,多次调用函数且未显式传递 list 参数时,会共享同一个默认列表。

  2. 执行过程

    • list1 = extendList(11)
      未传递 list 参数,使用默认的空列表 []
      添加 11 后,默认列表变为 [11]list1 指向该列表。

    • list2 = extendList(111, ['a','b','c'])
      显式传递新列表 ['a','b','c'],与默认列表无关。
      添加 123 后,返回 ['a','b','c', 111]list2 独立。

    • list3 = extendList('a')
      再次使用默认列表(此时已为 [11])。
      添加 'a' 后,默认列表变为 [11, 'a']list1list3 均指向此列表。

  3. 最终表现

    • list1list3 共享被修改后的默认列表,因此内容相同。

    • list2 因显式传递参数而独立。

总结:

Python 中若默认参数为可变对象(如列表),多次调用会导致共享同一对象。


解决方案

将默认参数设为不可变对象(如 None),在函数内初始化可变对象。
例如:

python

def extendList(val, list=None):
    if list is None:
        list = []
    list.append(val)
    return list

相关文章:

  • ES分词技术
  • SpringBoot:使用spring-boot-test对web应用做单元测试时如何测试Filter?
  • Redis 集群相关知识介绍
  • 小初高各学科教材,PDF电子版下载
  • 切换git仓库远程地址
  • C#windows窗体人脸识别
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atomic_cmp_set 函数
  • Django5的新特征
  • Manga Image Translator 开源 AI 漫画翻译工具的深度剖析
  • 【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​
  • ubuntu服务器 如何配置安全加固措施
  • Visual Studio 使用 “Ctrl + /”键设置注释和取消注释
  • 肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)
  • 安卓手游内存call综合工具/内部call/安卓注入call/数据分析(类人猿学院)
  • C语言-章节 4:函数的定义与声明 ——「神秘法术的卷轴」
  • stm32mp集成swupdateOTA升级
  • docker nginx 配置文件详解
  • vuedraggable固定某一item的记录
  • CentOS安装Docker,Ubuntu安装Docker,Docker解决方案
  • 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控
  • 上海乐高乐园明天正式开售年卡,下月开启试运营
  • 五一假期,长三角铁路张家港、台州等多个车站客发量创新高
  • 胖东来关闭官网内容清空?工作人员:后台维护升级
  • “五一”假期全社会跨区域人员流动量超14.65亿人次
  • 习近平对贵州毕节市黔西市游船倾覆事故作出重要指示
  • 浙江医生举报3岁男童疑遭生父虐待,妇联:已跟爷爷奶奶回家