洛水天依,浅吻心惜 2024-05-04 22:10 采纳率: 60%
浏览 3
已结题

python变量和列表之间的相互影响

描述:

在代码中使用了两行注释,如下

img

取消注释后,画图发生了变化

问题:
后面画图使用的列表与注释的两行无任何关系,但是取消注释对后续的画图结果有影响

如下为源代码:


from read_txt_file import read_txt_file
import matplotlib.pyplot as plt
import numpy as np

# 解决画图时无法显示中文的问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 使用微软雅黑字体
plt.rcParams['axes.unicode_minus'] = False  # 处理负号显示异常

delay_time = []
sum_spec = []

# 每个光谱求和,按时间画图
for i in range(0, 5000):  # 0~4999
    file_name = f"./neat/{i}.txt"
    try:  # 读取文件内容
        wavelength_, intensity_ = read_txt_file(file_name)
        delay_time.append(i)
        sum_spec.append(sum(intensity_))

    except FileNotFoundError:
        print(f"File '{file_name}' not found.")
    except IOError as e:
        print(f"Error reading file '{file_name}': {e}")

# FFT
num_samples = len(delay_time)
Rs = 1 / 133  # unit: e18 Hz
fft_result = np.fft.fft(sum_spec)
fft_result[0] = 0
freq = np.fft.fftfreq(num_samples, d=1 / Rs)

slice_sig = fft_result[234:270]
slice_freq = freq[234:270]
c = 299792458.0
waveL = slice_freq
# for i in range(len(waveL)):
#     waveL[i] = c / slice_freq[i]


plt.subplot(2, 1, 1)
plt.plot(freq, np.abs(fft_result))
plt.title('Frequency Spectrum')
plt.xlabel('Frequency (EHz)')
plt.ylabel('Magnitude')

plt.grid(True)
plt.show()

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-04 22:10
    关注

    引自免费微信小程序:皆我百晓生

    首先,让我们分析一下你的代码中涉及的部分,特别是关于变量waveLslice_freq的部分。

    在你的代码中,最初定义了waveL等于slice_freq

    waveL = slice_freq
    

    这意味着waveLslice_freq此时指向内存中的同一列表对象。之后,你有一段被注释掉的代码,目的是将waveL中的每个元素转换为波长值,基于公式c / frequency

    # for i in range(len(waveL)):
    #     waveL[i] = c / slice_freq[i]
    

    当这段代码被注释时,waveL保持与slice_freq相同,即它们都是频率值。但当你取消注释这段代码,waveL中的每个元素将会被替换为对应的波长值。因此,waveLslice_freq不再指向相同的数据。

    尽管你的问题描述中提到取消注释这段代码影响了后续的画图结果,但从提供的代码片段来看,实际上并未直接使用到waveL变量进行绘图。绘图部分是基于原始的频率数据fft_resultfreq进行的:

    plt.subplot(2, 1, 1)
    plt.plot(freq, np.abs(fft_result))
    

    这意味着取消注释那段代码理论上不应该直接影响到画图的结果,除非有其他未展示的代码部分或是外部依赖(例如read_txt_file函数内部)间接地受到了waveLslice_freq改变的影响。

    解决方案建议:

    1. 确认代码完整性:确保提供的代码是产生问题的全部相关代码,检查是否有其他地方使用到了waveL或因修改waveL而间接影响到绘图的逻辑。
    2. 理解数据依赖:再次审视read_txt_file函数的实现,确认它是否有可能受到全局变量状态改变的影响。
    3. 显式复制列表:为了避免潜在的引用问题,可以考虑在初始化waveL时做一个深拷贝,确保它与slice_freq是两个独立的列表对象。这可以通过copy模块或切片操作完成:
      waveL = slice_freq.copy()  # 或者 waveL = slice_freq[:]
      
      这样即使后续修改waveL,也不会影响到slice_freq,从而避免了可能的意外影响。

    由于直接从提供的代码看不出取消注释那两行代码为何会影响绘图结果,以上建议是基于理论分析。如果问题依然存在,可能需要进一步检查代码的其他部分或者提供更详细的上下文信息。

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

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 已采纳回答 5月4日
  • 创建了问题 5月4日

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)