목차
문제 분석 : 가변 재 할당 및 현장 수정
솔루션 1 : 실제 현실 수정
해결책 2 : 새 목록을 작성하고 반환합니다
요약 및 모범 사례
백엔드 개발 파이썬 튜토리얼 파이썬 목록 수정 및 가변 재 할당 : 기능 범위 깊이 분석

파이썬 목록 수정 및 가변 재 할당 : 기능 범위 깊이 분석

Oct 07, 2025 pm 01:18 PM

파이썬 목록 수정 및 가변 재 할당 : 기능 범위 깊이 분석

파이썬 함수의 목록 수정의 일반적인 함정

Python 프로그래밍, 특히 목록과 같은 변이 가능한 객체를 처리 할 때 개발자는 종종 문제가 발생합니다. 함수 내부 목록에서 작동 한 후 기능 외부 목록은 예상대로 변경되지 않은 것 같습니다. 이는 일반적으로 Python 변수 할당, 객체 참조 및 장소 수정 메커니즘에 대한 이해가 충분하지 않습니다. 이 기사는 특정 병합 분류 목록 케이스를 통해이 현상을 깊이 분석하고 두 가지 명확한 솔루션을 제공합니다.

문제 분석 : 가변 재 할당 및 현장 수정

다음 코드 스 니펫을 고려하십시오. 목표는 NUMS2의 내용을 NUMS1로 병합하고 NUMS1을 정렬하는 것이 목표이며 "값을 반환하지 않고 NUMS1을 수정하십시오":

 입력 가져 오기 목록에서

def merge_problematic (nums1 : list [int], m : int, nums2 : list [int], n : int) -> none :
    "" "
    아무것도 반환하지 말고 대신 내면에서 NUMS1을 수정하십시오.
    "" "
    mn == m :
        # nums1 = nums2 m == 0 else nums1 # 이것은 재 할당되지만 후속 논리와 관련이 없습니다. Pass #이 지점에 입력하지 않는다고 가정하면 처리를 단순화하십시오.
        # 문제의 요점 : 새 목록 객체가 여기에 생성되어 로컬 변수 NUMS1에 할당됩니다 1
        nums1 = nums1 [: m] nums2 

    print ( '내부 기능 (정렬 전), nums1 :', nums1) # 새 로컬 목록 인쇄 숫자 ( '내부 함수 (내부 기능), nums1 :', nums1) # 정렬 후 새 로컬 목록을 인쇄 # nums1_original = [1,2,0,0,0,0]
NUMS2_Example = [2,5,6]
m_val, n_val = 3, 3

print ( '기능 호출 전, nums1_original :', nums1_original)
MERGE_PROBLEMATIC (NUMS1_ORIGINAL, M_VAL, NUMS2_EXALLE, N_VAL)
print ( '기능 호출 후, nums1_original :', nums1_original) # found nums1_original이 변경되지 않음

위의 코드를 실행하면 MERGE_PROBLEMATIC 함수 내부의 NUMS1의 수정 (병합 및 정렬)이 함수 외부의 NUMS1_ORIGINAL에 반영되지 않음을 알 수 있습니다. 이것은 다른 분기에서 명령문 nums1 = nums1 [: m] nums2가 다음을 수행하기 때문에 다음을 수행하기 때문입니다.

  1. NUMS1 [: M] NUMS2는 병합 된 요소를 포함하는 새 목록 개체를 만듭니다.
  2. 이 새 목록 개체는 함수 내부의 로컬 변수 NUMS1 에 할당됩니다.

이는 함수 내에서 로컬 변수 NUMS1이 더 이상 원래 목록 객체 NUMS1_ORIGINAL을 가리키지 않고 새로 생성 된 목록을 가리키는 것을 의미합니다. 후속 NUMS1.SORT () 작업은이 새로운 로컬 목록을 정렬하는 것입니다. 함수가 실행 된 후, 로컬 변수와 새로운 목록이 파괴되는 반면, 함수 외부의 NUMS1_ORIGINAL 변수는 여전히 원래 목록 개체를 가리키므로 변경되지 않은 것 같습니다.

솔루션 1 : 실제 현실 수정

함수 문자 문자열에 명시 적으로 "NUMS1을 수정"해야하는 경우, 새 목록을 작성하고 값을 재 할당하는 대신 작업이 들어오는 목록 객체에서 직접 작동하는지 확인해야합니다. 현장 수정을 구현하기위한 열쇠는 목록 메소드 (예 : extend (), append (), sort ()) 또는 슬라이스 할당 (list [:] = ...)를 사용하는 것입니다.

다음은 슬라이스 할당을 사용하여 현장 수정을 구현하는 예입니다.

 입력 가져 오기 목록에서

def merge_in_place (nums1 : list [int], m : int, nums2 : list [int], n : int) -> none :
    "" "
    아무것도 반환하지 말고 대신 내면에서 NUMS1을 수정하십시오.
    "" "
    # nums1의 유효한 부분을 지우고 # nums1 [: m] = [] # 선택 사항을 채 웁니다. nums1 [: m]에 Nums1 [: m] 이후에 유지되어야하는 0이 있으면 병합 된 목록 내용을 구성 할 필요가 없습니다. merged_content = nums1 [: m] nums2 [: n] # n의 유효 길이도 여기에서 고려된다는 점에 유의하십시오.

    # 슬라이스 할당을 사용하여 NUMS1의 전체 범위에 새 컨텐츠를 할당# NUMS1 내부의 모든 요소를 ​​대체하지만 NUMS1 객체 자체의 참조 자체를 변경하지 않은 NUMS1 [:] = MERGED_CONTENT를 유지합니다.

    # 정렬 NUMS1 in SICT NUMS1.SORT ()

# 예제 전화 번호 1_original_inplace = [1,2,3,0,0,0]
NUMS2_EXALLE_INPLAPE = [2,5,6]
m_val, n_val = 3, 3

print ( '기능 호출 전 (내면), nums1_original_inplace :', nums1_original_inplace)
merge_in_place (nums1_original_inplace, m_val, nums2_example_inplace, n_val)
print ( '기능 호출 후 (내면), nums1_original_inplace :', nums1_original_inplace)
# 예상 출력 : [1, 2, 2, 3, 5, 6]

이 merge_in_place 함수에서 nums1 [:] = merged_content가 키입니다. NUMS1 변수에 새 목록 객체를 할당하는 대신 MERGED_CONTENT 목록의 모든 요소를 ​​NUMS1에 의해 가리키는 원래 목록 객체 로 복사하고 대체합니다. 이런 식으로, NUMS1_ORIGINAL_INPLACE 변수는 여전히 동일한 목록 객체를 가리키지 만 개체의 내용이 수정되었습니다. 후속 NUMS1.SORT ()는이 수정 된 원본 목록에서 직접 작용합니다.

해결책 2 : 새 목록을 작성하고 반환합니다

함수의 목적이이를 수정하는 것이 아니라 새로운 병합 및 정렬 된 목록을 생성하는 경우 가장 명확하고 가장 간단한 방법은 새 목록을 작성하여 반환하는 것입니다. 이는 부작용을 피하고 코드를 이해하고 디버그하기 쉽게 만들기 때문에 파이썬에서 데이터를 처리하기위한 일반적이고 권장되는 패턴입니다.

이 방법의 구현은 다음과 같습니다.

 입력 가져 오기 목록에서

def merge_and_return_new_list (nums1 : list [int], m : int, nums2 : list [int], n : int) -> list [int] :
    "" "
    NUMS1 및 NUMS2를 병합 한 다음 새 목록을 정렬하고 반환합니다.
    NUMS1 또는 NUMS2 내에서 수정하지 않습니다.
    "" "
    # NUMS1 및 NUMS2의 효과적인 부분을 추출합니다. Effectio_Nums1 = NUMS1 [: M]
    explud_nums2 = nums2 [: n]

    # 두 목록을 병합하고 새 목록 작성 new_list = explue_nums1 explic_nums2

    # 새 목록 정렬# sorted () 함수 원본 목록을 수정하지 않고 새 정렬 된 목록을 반환합니다.

    Sorted_new_list를 반환합니다

# 예제 전화 번호 1_for_new = [1,2,3,0,0,0]
NUMS2_FOR_NEW = [2,5,6]
m_val, n_val = 3, 3

print ( '기능 호출 전 (새로운 반환), nums1_for_new :', nums1_for_new)
result_list = merge_and_return_new_list (nums1_for_new, m_val, nums2_for_new, n_val)
print ( 'function call (return new), nums1_for_new :', nums1_for_new) # 변경되지 않은 인쇄를 남기십시오 ( '반환 된 병합 및 정렬 된 목록 :', result_list)
# 예상 출력 : [1, 2, 2, 3, 5, 6]

이 방법은 간단하고 간단합니다. 함수는 입력을 수신하고 결과를 계산하며 결과를 새로운 목록으로 반환합니다. 원래 NUMS1 및 NUMS2 목록은 기능 호출 전후에 변경되지 않은 상태로 유지됩니다. 이 "순수한 기능"스타일은 코드의 복잡성과 잠재적 부작용을 줄이기 때문에 많은 시나리오에서 더 인기가 있습니다.

요약 및 모범 사례

Python에서 가변 할당과 객체 참조의 차이를 이해하는 것은 정확하고 유지 관리 가능한 코드를 작성하는 데 중요합니다.

  1. 가변 할당 (var = value) : 함수 내부의 매개 변수로 전달 된 목록에서 var = new_list와 같은 할당 작업을 수행하면 로컬 변수가 함수 외부에 전달 된 원래 목록 객체에 영향을 미치지 않으면 서 로컬 변수가 새 목록 개체를 가리 키게됩니다.
  2. 제자리에 수정 (list.method () 또는 list [:] = ...) : 전달 된 목록 객체를 실제로 수정하려면 (예 : append (), extend (), sort ()) 또는 슬라이스 할당 (list [:] = new_content)를 사용해야합니다. 이러한 작업은 변수가 가리키는 객체 자체를 변경하지 않고 목록 객체의 내용을 직접 수정합니다.

기능을 설계 할 때는 귀하의 요구에 따라 명확하게하십시오.

  • 들어오는 목록을 현장에서 수정 해야하는 경우 : 목록 내용을 조작하기 위해 목록 메소드 또는 슬라이스 할당을 사용해야합니다.
  • 새 목록을 반환 할 수있는 경우 : 일반적으로 외부 상태에 대한 예기치 않은 수정을 피하기 때문에 새 목록을 작성하고 반환하는 것이 더 명확하고 안전합니다.

선택할 방법은 특정 기능 설계 요구 사항 및 컨텍스트에 따라 다릅니다. 이 두 가지 메커니즘에 대한 명확한 이해는 일반적인 Python 목록 작동 트랩을 피하는 데 도움이됩니다.

위 내용은 파이썬 목록 수정 및 가변 재 할당 : 기능 범위 깊이 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT

Stock Market GPT

더 현명한 결정을 위한 AI 기반 투자 연구

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제

Python에서 요구 사항에서 패키지를 설치하는 방법 Python에서 요구 사항에서 패키지를 설치하는 방법 Sep 18, 2025 am 04:24 AM

종속성 패키지를 설치하려면 pipinstall-rrequirements.txt를 실행하십시오. 충돌을 피하고, 파일 경로가 올바른지 확인하고 PIP가 업데이트되었는지 확인하고 필요한 경우 설치 동작을 조정하기 위해-no-deps 또는 --user와 같은 옵션을 사용하는 것이 좋습니다.

PEFT LORA 어댑터 및 기본 모델의 효율적인 병합 전략 PEFT LORA 어댑터 및 기본 모델의 효율적인 병합 전략 Sep 19, 2025 pm 05:12 PM

이 튜토리얼은 PEFT LORA 어댑터를 기본 모델과 효율적으로 병합하여 완전히 독립적 인 모델을 생성하는 방법을 자세히 설명합니다. 이 기사는 변압기를 직접 사용하는 것이 잘못되었음을 지적합니다. Aumodel은 어댑터를로드하고 가중치를 수동으로 병합하고 PEFT 라이브러리에서 MERGE_AND_UNLOAD 방법을 사용하는 올바른 프로세스를 제공합니다. 또한 튜토리얼은 워드 세그먼트를 다루는 것의 중요성을 강조하고 PEFT 버전 호환성 문제 및 솔루션에 대해 설명합니다.

Pytest로 Python 코드를 테스트하는 방법 Pytest로 Python 코드를 테스트하는 방법 Sep 20, 2025 am 12:35 AM

Python은 Python의 간단하고 강력한 테스트 도구입니다. 설치 후 테스트 파일은 이름 지정 규칙에 따라 자동으로 발견됩니다. 어설 션 테스트를 위해 test_로 시작하여 기능을 작성하고 @pytest.fixture를 사용하여 재사용 가능한 테스트 데이터를 생성하고 pytest.raises를 통해 예외를 확인하고 지정된 테스트 실행 및 여러 명령 줄 옵션을 지원하며 테스트 효율성을 향상시킵니다.

파이썬에서 명령 줄 인수를 처리하는 방법 파이썬에서 명령 줄 인수를 처리하는 방법 Sep 21, 2025 am 03:49 AM

theargparsemoduleisecomedendedway handlecommand-lineargumentsinpython, robustparsing, typevalidation, helpmessages, anderrorhandling; audys.argvforsimplecaseSrequiringMinimalSetup을 제공합니다.

파이썬 및 고정밀 계산 체계의 부동 소수점 번호 정확도 문제 파이썬 및 고정밀 계산 체계의 부동 소수점 번호 정확도 문제 Sep 19, 2025 pm 05:57 PM

이 기사는 Python과 Numpy의 부동 소수점 수의 부동 소수 계산 정확도의 일반적인 문제를 탐색하는 것을 목표로하며, 근본 원인은 표준 64 비트 플로팅 포인트 수의 표현 제한에 있다고 설명합니다. 더 높은 정확도가 필요한 컴퓨팅 시나리오의 경우,이 기사는 독자가 복잡한 정확도 요구를 해결하기위한 올바른 도구를 선택할 수 있도록 MPMATH, Sympy 및 GMPY와 같은 고정밀 수학 라이브러리의 사용 방법, 기능 및 해당 시나리오를 소개하고 비교합니다.

Python에서 PDF 파일을 사용하는 방법 Python에서 PDF 파일을 사용하는 방법 Sep 20, 2025 am 04:44 AM

PYPDF2, PDFPLAMBER 및 FPDF는 Python이 PDF를 처리하기위한 핵심 라이브러리입니다. PYPDF2를 사용하여 PDFREADER를 통해 페이지를 읽고 extract_text ()를 호출하려면 텍스트 추출, 병합, 분할 및 암호화를 수행하십시오. PDFPlumber는 레이아웃 텍스트 추출 및 테이블 인식을 유지하는 데 더 적합하며 TABLE 데이터를 정확하게 캡처하기 위해 Extract_Tables ()를 지원합니다. FPDF (권장 FPDF2)는 PDF를 생성하는 데 사용되며 문서는 add_page (), set_font () 및 cell ()을 통해 구축 및 출력됩니다. pdfs를 병합 할 때 pdfwriter의 append () 메소드는 여러 파일을 통합 할 수 있습니다.

Python에서 @ContextManager 데코레이터를 사용하여 컨텍스트 관리자를 어떻게 만들 수 있습니까? Python에서 @ContextManager 데코레이터를 사용하여 컨텍스트 관리자를 어떻게 만들 수 있습니까? Sep 20, 2025 am 04:50 AM

import@contextManagerFromContextLibandDefineAgeneratorFunctionThatYieldSActlyOnce, whereCodeBeforeYieldActSasEnterAndErandCodeftertyield (바람직하게는) ACTSAS__EXIT __

파이썬은 현재 시간 예제를 얻습니다 파이썬은 현재 시간 예제를 얻습니다 Sep 15, 2025 am 02:32 AM

현재 시간을 얻는 것은 DateTime 모듈을 통해 Python에서 구현할 수 있습니다. 1. DateTime.now ()를 사용하여 로컬 현재 시간을 얻으십시오. utcnow () 및 일일 작업은 Datetime.now ()를 형식의 문자열과 결합하여 요구를 충족시킬 수 있습니다.

See all articles